Skip to main content

1C - Интерес (Лабораторные)

Изучение модулей разработки информационной базы в 1С по всем направлениям

Процедура по переносу данных из реквизитов справочника в реквизиты документа

Необходимо перенести номер мобильного телефона, который хранится в справочнике Физические Лица. Этот перенос будет осуществляться при изменении реквизита ФИО в документе. Процедура создается и на клиенте и на сервере, потому что обращение к реквизитам справочника идет через сервер.

&НаКлиенте 
Процедура ФИОПриИзменении(Элемент) 
ФИОПриИзмененииНаСервере (); 
КонецПроцедуры 
&НаСервере 
Процедура ФИОПриИзмененииНаСервере() 
Объект.Телефон=Справочники.ФизическиеЛица.НайтиПоНаименованию(Объект.ФИО).ТелефонМобильный; 
КонецПроцедуры 

где, 
Телефон – название реквизита документа куда необходимо поместить номер телефона из справочника ФизическиеЛица. Реквизит справочника в котором хранится номер телефона ТелефонМобильный - откуда. 
Если необходимо перенести информацию из реквизита справочника в реквизит документа, строка выглядит следующим образом: 
           Объект.Телефон=Справочники.ФизическиеЛица.НайтиПоНаименованию(Объект.ФИО).ТелефонМобильный; где,  
Объект.Телефон – Объект(обращение к объекту, стандартное слово).Телефон – название реквизита документа куда надо поместить информацию(меняется в зависимости от названия реквизита). 
Справочники – общее название объектов, откуда берется информация (в нашем случае из Справочника) 
ФизическиеЛица – название справочника из которого будет браться информация(меняется в зависимости от названия справочника откуда берется информация). 
НайтиПоНаименованию(Объект.ФИО) – метод для поиска информации в зависимости от наименования (наименование пишется в заголовке процедуры, то есть при изменении чего работает данная процедура, в нашем случае «Процедура ФИОПриИзмененииНаСервере()» при изменении ФИО. 
ТелефонМобильный – название реквизита справочника откуда берется информация. 
Все что выделено серым цветом, является постоянными словами при написании модуля по переносу данных из реквизита справочника в реквизит документа.

Процедура по переносу данных из реквизитов справочника в реквизиты табличной части документа. 
Необходимо перенести номер мобильного телефона при выборе определенного человека. Этот перенос будет осуществляться при изменении реквизита ФИО табличной части ТабличнаяЧасть1 в документе. Процедура создается и на клиенте, и на сервере, потому что обращение к реквизитам справочника идет через сервер, но, чтобы получить конкретное значение телефона для определенного человека, создаем функцию.

&НаКлиенте 
Процедура ТабличнаяЧасть1ФИОПриИзменении(Элемент) 
 	СтрокаТабличнойЧасти=Элементы.ТабличнаяЧасть1.ТекущиеДанные; 
 	СтрокаТабличнойЧасти.Телефон=ПолучитьТелефон(СтрокаТабличнойЧасти.ФИО); КонецПроцедуры 
 
&НаСервере 
Функция ПолучитьТелефон(Элемент) 
А=Справочники.ФизическиеЛица.НайтиПоНаименованию(Элемент).ТелефонМобильный; Возврат А; 
КонецФункции

где, 
СтрокаТабличнойЧасти=Элементы.ТабличнаяЧасть1.ТекущиеДанные; - дополнительная переменная при работе с табличной частью. 
ТабличнаяЧасть1 – название табличной части где происходит действие. 
СтрокаТабличнойЧасти.Телефон=ПолучитьТелефон(СтрокаТабличнойЧасти.ФИО); 
Телефон – название реквизита табличной части ТабличнаяЧасть1, куда необходимо поместить данные по мобильному телефону 
ПолучитьТелефон – название функции 
ФИО – при изменении этого реквизита происходит событие по переносу данных А=Справочники.ФизическиеЛица.НайтиПоНаименованию(ФИО).ТелефонМобильный; А – произвольная переменная, которой присваивается значение мобильного телефона Возврат А; - Возврат – служебное слово по возврату значения. 
Все что выделено серым цветом, является постоянными словами при написании модуля по переносу данных из реквизита справочника в реквизиты табличной части документа.

Процедура расчета суммы в табличной части

Необходимо рассчитать сумму в табличной части ТабличнаяЧасть1. Сумма считается, как Цена умножить на Количество. Действия в табличной части пишутся на клиенте. Процедуры прописываются и при изменении цены, и при изменении количества.

&НаКлиенте 
Процедура ТабличнаяЧасть1ЦенаПриИзменении(Элемент) 
 	СтрокаТабличнойЧасти=Элементы.ТабличнаяЧасть1.ТекущиеДанные; 
 СтрокаТабличнойЧасти.Сумма=СтрокаТабличнойЧасти.Цена*СтрокаТабличнойЧасти.Количество; КонецПроцедуры

Процедура по расчету общей суммы документа 
 Необходимо рассчитать общий итог документа, как сумма всех колонок «Сумма» в табличной части «ТабличнаяЧасть1» и поместить полученный результат в реквизит документа «ОбщаяСумма». Процедура пишется на клиенте. 

&НаКлиенте 
Процедура ТабличнаяЧасть1СуммаПриИзменении(Элемент) 
 	Объект.ОбщаяСумма=Объект.ТабличнаяЧасть1.Итог("Сумма"); 
КонецПроцедуры 

где,  
Объект.ОбщаяСумма=Объект.ТабличнаяЧасть1.Итог("Сумма"); 
ОбщаяСумма – название реквизита куда надо поместить расчетное значение общей суммы документа ТабличнаяЧасть1 – название табличной части по которой будет считаться общая сумма документа Сумма – название колонки в табличной части по которой будет считаться общая сумма документа. 
 
Все что выделено серым цветом, является постоянными словами при написании модуля по расчету общей суммы документа. 

Функция по поиску нужной переменной, которая хранится в регистре сведений. 

Функция ПолучитьЦену(АктуальнаяДата, Элемент) 
Отбор=Новый Структура("Товар", Элемент); 
ЗР=РегистрыСведений.ЦенаНаТовар.ПолучитьПоследнее(АктуальнаяДата, Отбор); Возврат ЗР.Цена; 
КонецФункции 

Где, 
ПолучитьЦену – произвольное название функции 
(АктуальнаяДата, Элемент) – переменные, которые нужны чтобы узнать нужное значение. В примере находим цену на товар. Чтобы узнать нужную цену, необходимо знать дату, на которую ищется цена и название товара. 
Отбор – произвольная переменная для хранения структуры 
Новый Структура – создание новой структуры. Если информация хранится в регистре сведений, то создание структуры является обязательным. 
"Товар" – название измерения регистра сведений. 
ЗР – произвольная переменная, при помощи которой указывается путь и метод для поиска нужной информации. 
ЦенаНаТовар – название регистра сведений Цена – название ресурса из регистра сведений. 
 
Функция пишется на сервере.

Пример: из регистра сведений «АктуальнаяДолжность» нужно выбрать должность сотрудника. В регистре есть измерение «ФИО» и ресурс «Должность». Решение: 

Функция ПолучитьДолжность(АктуальнаяДата, Элемент) 
Отбор=Новый Структура("ФИО", Элемент); 
ЗР=РегистрыСведений.АктуальнаяДолжность.ПолучитьПоследнее(АктуальнаяДата, Отбор); Возврат ЗР.Должность; 
КонецФункции 

Пример по поиску остатков материалов на складе и подстановке их в определенное поле с дополнительной проверкой продается товар сотруднику или нет

&НаКлиенте
Процедура ТЧНазваниеПриИзменении(Элемент)
СтрокаТЧ = Элементы.ТЧ.ТекущиеДанные;
СтрокаТЧ.ЕдиницаИзмерения = ПолучитьЕдИзм(СтрокаТЧ.Название);
СтрокаТЧ.ВНаличии = ПолучитьОстаток(СтрокаТЧ.Название, Объект.Дата);
Если Объект.Сотрудник=Истина Тогда
СтрокаТЧ.Цена = ПолучитьЦену(Объект.Дата,СтрокаТЧ.Название)*1.05;
Иначе СтрокаТЧ.Цена = ПолучитьЦену(Объект.Дата,СтрокаТЧ.Название)*1.4; 
КонецЕсли;
КонецПроцедуры

&НаСервере
Функция ПолучитьЕдИзм(Элемент)
А=Справочники.Товары.НайтиПоНаименованию(Элемент).ЕдиницаИзмерения;
Возврат А;
КонецФункции

Функция ПолучитьОстаток(Элемент,АктуальнаяДата)
ОстаткиНаСкладе = РегистрыНакопления.ТоварыНаСкладе;
Отбор = Новый Структура ("Товар", Элемент);
ТабОстатков = ОстаткиНаСкладе.Остатки(АктуальнаяДата, Отбор, "Товар", "Колво");
Возврат ТабОстатков.Итог("Колво");
КонецФункции

Проверка на наличие нужного товара на складе

&НаКлиенте
Процедура ТЧКолвоПриИзменении(Элемент)
СтрокаТЧ = Элементы.ТЧ.ТекущиеДанные;
    СтрокаТЧ.Сумма = СтрокаТЧ.Колво * СтрокаТЧ.Цена;
Объект.ОбщаяСуммаДокумента=Объект.ТЧ.Итог("Сумма");
Если СтрокаТЧ.Колво>СтрокаТЧ.ВНаличии Тогда
СтрокаТЧ.Колво=0;
ПоказатьПредупреждение (,"Данного товара нет в таком количестве!",20,);
Иначе 
КонецЕсли;
КонецПроцедуры

Проверка дня рождения сотрудника

Модуль приложения:
Процедура ПриНачалеРаботыСистемы()
ОбщийМ.СформироватьНаСервере();
КонецПроцедуры

Общий модуль, сервер, вызов сервера
Процедура СформироватьНаСервере() Экспорт
    Выборка=Справочники.Сотрудники.Выбрать();
    Пока Выборка.Следующий() Цикл
        
        Если Месяц(ТекущаяДата())= Месяц(Выборка.ДатаРождения) И День(ТекущаяДата())=День(Выборка.ДатаРождения) Тогда
            Сообщить("Сегодня день рождения у сотрудника:"+Выборка.Наименование);
        КонецЕсли;    
    КонецЦикла;
    КонецПроцедуры

Модуль по загрузке данных из Excel. 

&НаСервере 
Процедура ЗагрузитьПользователейНаСервере(ВыбранноеИмяФайла) 
 	ТабДок = Новый ТабличныйДокумент; 
 	Попытка 
 	 	ТабДок.Прочитать(ВыбранноеИмяФайла); 
 	Исключение 
 	 	Сообщить("Файл не выбран"); 
 	 	Возврат; 
 	КонецПопытки; 
 	ПостроительЗапроса = Новый ПостроительЗапроса; 
 	ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область("Пользователи")); 
 	ПостроительЗапроса.Выполнить(); 
 	ТаблицаДанных = ПостроительЗапроса.Результат.Выгрузить(); 
 	ТаблицаДанных.Количество(); 
 	Пользователи = Справочники.Пользователи; 
 	Для Каждого Строка Из ТаблицаДанных Цикл 
 	 	Если Пользователи.НайтиПоНаименованию(Строка.ФИО).Пустая() Тогда 
 	 	НовыйЭлемент = Пользователи.СоздатьЭлемент(); 
 	    НовыйЭлемент.Наименование = Строка.ФИО;  
 	 	НовыйЭлемент.Логин = Строка.Логин; 
 	 	НовыйЭлемент.Пароль = Строка.Пароль; 
 	 	Пер1 = Перечисления.Роль.Администратор; 
 	 	Пер2 = Перечисления.Роль.МенеджерПоЗакупкам; 
 	 	Пер3 = Перечисления.Роль.МенеджерПоПродажам; 
 	 	Пер4 = Перечисления.Роль.Мастер; 
 	 	Если Строка.Роль = "Администратор"  Тогда 
 	 	 	НовыйЭлемент.Роль = Пер1; Иначе 
 	 	 	 	Если Строка.Роль = "Менеджер по закупкам" Тогда 
 	 	 	 	 	НовыйЭлемент.Роль = Пер2; Иначе 
 	 	 	 	 	 	Если Строка.Роль = "Менеджер по продажам" Тогда 
 	 	 	 	 	 	 	НовыйЭлемент.Роль = Пер3; Иначе 
 	 	 	 	 	 	 	 	Если Строка.Роль = "Мастер" Тогда 
 	 	 	 	 	 	 	 	 	НовыйЭлемент.Роль = Пер4; 
 	 	 	 	 	 	 	 	КонецЕсли; 
 	 	 	 	 	 	КонецЕсли; 
 	 	 	 	КонецЕсли; 
 	 	КонецЕсли; 
//ссылка на справочник 
НовыйЭлемент.ГОСТ = Справочники.ГОСТ.НайтиПоНаименованию(Строка.ГОСТ); 
 	 	Если НовыйЭлемент.ГОСТ.Пустая() Тогда 
 	 	 	ГОСТОбъект = Справочники.ГОСТ.СоздатьЭлемент(); 
 	 	 	ГОСТОбъект.Наименование = Строка.ГОСТ; 
 	 	 	ГОСТОбъект.Записать(); 
 	 	 	НовыйЭлемент.ГОСТ = ГОСТОбъект.Ссылка; 
 	 	КонецЕсли; 
 	 	НовыйЭлемент.Записать(); 
 	 	КонецЕсли; 
 	КонецЦикла; 
 	Сообщить("Загрузка завершена");  
КонецПроцедуры 
 
&НаКлиенте 
Процедура ЗагрузитьПользователей(Команда) 
 	НачатьПомещениеФайла(Новый ОписаниеОповещения("ПослеВыбораФайла",ЭтотОбъект)); 
КонецПроцедуры 
 
Процедура ПослеВыбораФайла(Результат, Адрес, ВыбранноеИмяФайла, ДопПараметры) Экспорт 
 	Если Не ПустаяСтрока(ВыбранноеИмяФайла) Тогда 
 	 	ЗагрузитьПользователейНаСервере(ВыбранноеИмяФайла); 
 	КонецЕсли; 
КонецПроцедуры

Перерасчет регистра бухгалтерии

Процедура ПерерассчитатьНачисления(ТребуемыйВидРасчета) Экспорт
// Здесь следует выбрать из набора записей перерасчета записи в следующей последовательности:
// записи документа1 для сотрудников из списка,
// записи документа2 для сотрудников из списка и т. д.
Запрос = Новый Запрос(
"ВЫБРАТЬ
| НачисленияПерерасчет.ОбъектПерерасчета,
| НачисленияПерерасчет.Сотрудник
|ИЗ
| РегистрРасчета.Начисления.Перерасчет КАК НачисленияПерерасчет
|ГДЕ
| НачисленияПерерасчет.ВидРасчета = &ТребуемыйВидРасчета
|ИТОГИ ПО
| НачисленияПерерасчет.ОбъектПерерасчета");
Запрос.УстановитьПараметр("ТребуемыйВидРасчета", ТребуемыйВидРасчета);
СписокСотрудников = Новый СписокЗначений;
// Перебрать группировку по регистратору.
ВыборкаПоРегистратору = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаПоРегистратору.Следующий() Цикл
Регистратор = ВыборкаПоРегистратору.ОбъектПерерасчета;
// Перебрать группировку по сотрудникам для выбранного регистратора
// и создать список сотрудников.
ВыборкаПоСотрудникам = ВыборкаПоРегистратору.Выбрать();
СписокСотрудников.Очистить();
Пока ВыборкаПоСотрудникам.Следующий() Цикл
СписокСотрудников.Добавить(ВыборкаПоСотрудникам.Сотрудник);
КонецЦикла;
// Получить набор записей регистра расчета для выбранного регистратора.
НаборЗаписей = РегистрыРасчета.Начисления.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Значение = Регистратор;
НаборЗаписей.Прочитать();
РассчитатьНачисления(НаборЗаписей, ТребуемыйВидРасчета, СписокСотрудников);
НаборЗаписей.Записать( , Истина);
// Очистить перерассчитанные записи в перерасчете.
НаборЗаписейПерерасчета =
РегистрыРасчета.Начисления.Перерасчеты.Перерасчет.СоздатьНаборЗаписей();
НаборЗаписейПерерасчета.Отбор.ОбъектПерерасчета.Значение = Регистратор;
НаборЗаписейПерерасчета.Записать();
КонецЦикла;
КонецПроцедуры

Добавление картинки

реквизит ДанныеКартинки, реквизит на форме СсылкаНаКартинку (поле надписи), кнопка ВыбратьФайлКартинки

image.png

Модуль планировщика с измерениями

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Дата = ТекущаяДата();
	СоздатьИзмеренияПланировщика();	
	ОбновитьПериодОтображенияПланировщика();
	
	ЗаполнитьЖурналЗаписей();

КонецПроцедуры

&НаКлиенте
Процедура ПланировщикПередСозданием(Элемент, Начало, Конец, ЗначенияИзмерений, Текст, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;                     
	ЗначенияЗаполнения = Новый Структура;
	ЗначенияЗаполнения.Вставить("Дата", Начало);
	ЗначенияЗаполнения.Вставить("ДатаОкончания", Конец);
	ЗначенияЗаполнения.Вставить("Группа", ЗначенияИзмерений["Группа"]);
	
	СтруктураПараметров = Новый Структура("ЗначенияЗаполнения", ЗначенияЗаполнения);
	
	ОткрытьФорму("Документ.ПланируемыеМероприятия.ФормаОбъекта", СтруктураПараметров);

КонецПроцедуры

&НаКлиенте
Процедура ПланировщикПередНачаломРедактирования(Элемент, НовыйЭлемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ВыделенныеЭлементы = Элемент.ВыделенныеЭлементы;  
	
	ЭлементПланировщика = ВыделенныеЭлементы[0];
	
	СтруктураПараметров = Новый Структура("Ключ", ЭлементПланировщика.Значение);
	ОткрытьФорму("Документ.ПланируемыеМероприятия.ФормаОбъекта", СтруктураПараметров);

КонецПроцедуры

&НаКлиенте
Процедура ПланировщикПередУдалением(Элемент, Отказ)
	Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ПланировщикПриОкончанииРедактирования(Элемент, НовыйЭлемент, ОтменаРедактирования)
		ВыделенныеЭлементы = Элемент.ВыделенныеЭлементы;  
	ЭлементПланировщика = ВыделенныеЭлементы[0];
	
	ЗначенияРеквизитов = Новый Структура;
	ЗначенияРеквизитов.Вставить("Дата", ЭлементПланировщика.Начало);
	ЗначенияРеквизитов.Вставить("ДатаОкончания", ЭлементПланировщика.Конец);
	ЗначенияРеквизитов.Вставить("Группа", ЭлементПланировщика.ЗначенияИзмерений["Группа"]);
	
	ОбновитьДанныеЗаписи(ЭлементПланировщика.Значение, ЗначенияРеквизитов);

КонецПроцедуры

&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
	ОбновитьПериодОтображенияПланировщика();
	ЗаполнитьЖурналЗаписей();

КонецПроцедуры

&НаСервере
Процедура ОбновитьПериодОтображенияПланировщика()
	
	Начало = НачалоДня(Дата) + 9*3600;
	Конец = НачалоДня(Дата) + 19*3600;
	
	Планировщик.ТекущиеПериодыОтображения.Очистить();
	Планировщик.ТекущиеПериодыОтображения.Добавить(Начало, Конец);

КонецПроцедуры // ОбновитьПериодОтображенияПланировщика()

&НаСервере
Процедура ЗаполнитьЖурналЗаписей()
	
	Планировщик.Элементы.Очистить();
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ПланируемыеМероприятия.ДатаИВремяПроведения КАК ДатаИВремяПроведения,
		|	ПланируемыеМероприятия.Группа КАК Группа,
		|	ПРЕДСТАВЛЕНИЕ(ПланируемыеМероприятия.ВидМероприятия) КАК ВидМероприятия,
		|	ПланируемыеМероприятия.Длительность КАК Длительность,
		|	ПланируемыеМероприятия.Тема КАК Тема,
		|	ПланируемыеМероприятия.Ссылка КАК Ссылка
		|ИЗ
		|	Документ.ПланируемыеМероприятия КАК ПланируемыеМероприятия
		|ГДЕ
		|	ПланируемыеМероприятия.Проведен
		|	И ПланируемыеМероприятия.ДатаИВремяПроведения МЕЖДУ &ДатаНачала И &ДатаОкончания";
	
	Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(Дата));
	Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(Дата));
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = РезультатЗапроса.Выбрать();
	
	Пока Выборка.Следующий() Цикл
		
		ЗначенияИзмерений = Новый Соответствие;
		ЗначенияИзмерений.Вставить("Группа", Выборка.Группа);
		
		ЖирныйШрифт = Новый Шрифт(,,Истина);		                                                                       
		
		ПредставлениеТемы = Выборка.ВидМероприятия + ", " + Выборка.Тема;
		МассивСтрок = Новый Массив;
		МассивСтрок.Добавить(Новый ФорматированнаяСтрока(ПредставлениеТемы, ЖирныйШрифт));
		МассивСтрок.Добавить(Символы.ПС);
					
		ЭлементПланировщика = Планировщик.Элементы.Добавить(Выборка.ДатаИВремяПроведения, Выборка.ДатаИВремяПроведения+Выборка.Длительность);
		ЭлементПланировщика.ЗначенияИзмерений = Новый ФиксированноеСоответствие(ЗначенияИзмерений);	
		ЭлементПланировщика.Значение = Выборка.Ссылка;
		ЭлементПланировщика.Текст = Новый ФорматированнаяСтрока(МассивСтрок);
		Цвет = WebЦвета.БледноЛиловый;
			
		ЭлементПланировщика.ЦветФона = Цвет;
		
	КонецЦикла;
	
		
КонецПроцедуры // ЗаполнитьПланировщикПоМероприятиям()    
&НаСервере
Процедура СоздатьИзмеренияПланировщика()

	Измерение = Планировщик.Измерения.Добавить("Группа");
	
	Выборка = Справочники.Группы.Выбрать();
	Пока Выборка.Следующий() Цикл
		
		Если Выборка.ПометкаУдаления Тогда
			Продолжить;
		КонецЕсли;		
		
		ЗначениеИзмерения = Измерение.Элементы.Добавить(Выборка.Ссылка);	
		ЗначениеИзмерения.Текст = Выборка.Наименование;
		ЗначениеИзмерения.ЦветРамки = WebЦвета.Синий;
	
	КонецЦикла;

КонецПроцедуры // СоздатьИзмеренияПланировщика()

&НаСервереБезКонтекста
Процедура ОбновитьДанныеЗаписи(Мероприятие, ЗначенияРеквизитов)
	
	ОбъектЗаписи = Мероприятие.ПолучитьОбъект();
	
	ЕстьИзмения = Ложь;
	Для каждого Реквизит Из ЗначенияРеквизитов Цикл
		Если ОбъектЗаписи[Реквизит.Ключ] <> Реквизит.Значение Тогда
			ЕстьИзмения = Истина;
			Прервать;
		КонецЕсли;		
	КонецЦикла;	
	
	Если ЕстьИзмения Тогда
		ЗаполнитьЗначенияСвойств(ОбъектЗаписи, ЗначенияРеквизитов);
		ОбъектЗаписи.Длительность = (ОбъектЗаписи.ДатаОкончания - ОбъектЗаписи.Дата) / 60;
		ОбъектЗаписи.Записать(РежимЗаписиДокумента.Проведение);
	КонецЕсли;   
	
КонецПроцедуры // ОбновитьДанныеЗаписи()

Модуль обычного планировщика

&НаСервере
Процедура СотрудникПриИзмененииНаСервере()
	Планировщик.Элементы.Очистить();
	 	//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ПланируемыеМероприятия.Ссылка КАК Ссылка,
		|	ПланируемыеМероприятия.ДатаИВремяПроведения КАК ДатаИВремяПроведения,
		|	ПланируемыеМероприятия.Сотрудник КАК Сотрудник,
		|	ПланируемыеМероприятия.Группа КАК Группа,
		|	ПланируемыеМероприятия.ВидМероприятия КАК ВидМероприятия,
		|	ПланируемыеМероприятия.Длительность КАК Длительность,
		|	ПланируемыеМероприятия.Тема КАК Тема
		|ИЗ
		|	Документ.ПланируемыеМероприятия КАК ПланируемыеМероприятия
		|ГДЕ
		|	ПланируемыеМероприятия.Сотрудник = &Сотрудник
		|
		|УПОРЯДОЧИТЬ ПО
		|	ДатаИВремяПроведения
		|АВТОУПОРЯДОЧИВАНИЕ";
	
	Запрос.УстановитьПараметр("Сотрудник", Сотрудник);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		НовыйЭлемент=Планировщик.Элементы.Добавить(ВыборкаДетальныеЗаписи.ДатаИВремяПроведения,ВыборкаДетальныеЗаписи.ДатаИВремяПроведения+60*60);
		Если ВыборкаДетальныеЗаписи.ДатаИВремяПроведения>ТекущаяДата() Тогда
			НовыйЭлемент.Текст="Группа: "+Строка(ВыборкаДетальныеЗаписи.Группа)+" Вид: "+Строка(ВыборкаДетальныеЗаписи.ВидМероприятия)+" Тема: "+ВыборкаДетальныеЗаписи.Тема;
			НовыйЭлемент.Значение=ВыборкаДетальныеЗаписи.Ссылка;
			НовыйЭлемент.ЦветФона=WebЦвета.БледноЗеленый;
			НовыйЭлемент.ЦветТекста=WebЦвета.Синий;
		Иначе
			НовыйЭлемент.Текст="Группа: "+Строка(ВыборкаДетальныеЗаписи.Группа)+" Вид: "+Строка(ВыборкаДетальныеЗаписи.ВидМероприятия)+" Тема: "+ВыборкаДетальныеЗаписи.Тема;
			НовыйЭлемент.Значение=ВыборкаДетальныеЗаписи.Ссылка;
			НовыйЭлемент.ЦветФона=WebЦвета.СеребристоСерый;
			НовыйЭлемент.ЦветТекста=WebЦвета.Синий;
			КонецЕсли;

			
	КонецЦикла;
	
	//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

КонецПроцедуры

&НаКлиенте
Процедура СотрудникПриИзменении(Элемент)
	СотрудникПриИзмененииНаСервере();
КонецПроцедуры

&НаКлиенте
Процедура ПланировщикПередНачаломРедактирования(Элемент, НовыйЭлемент, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
	ПараметрыФормы=Новый Структура("Ключ",Элемент.ВыделенныеЭлементы[0].Значение);
	ОткрытьФорму("Документ.ПланируемыеМероприятия.ФормаОбъекта",ПараметрыФормы);
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	СтандартнаяОбработка=Ложь;
Планировщик.ЕдиницаПериодическогоВарианта=ТипЕдиницыШкалыВремени.Час;
Планировщик.КратностьПериодическогоВарианта=24;
Планировщик.ОтступСНачалаПереносаШкалыВремени=8;
Планировщик.ОтступСКонцаПереносаШкалыВремени=7;
Планировщик.ВыравниватьГраницыЭлементовПоШкалеВремени=Ложь;
КонецПроцедуры

Загрузка из Веб-сервиса 

Создание WS-Ссылки, команды и группы. У команды проставить группу отображения (Панель навигации.Общие). 

image.png

&НаКлиенте 
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) 
    ЗагрузитьКурсыВалют(); 
 	Сообщить("Курсы валют загружены"); 
КонецПроцедуры 
 
&НаСервере 
Процедура ЗагрузитьКурсыВалют() 
 	 
 	Прокси = WSСсылки.КурсыВалютЦБ.СоздатьWSПрокси("http://web.cbr.ru/","DailyInfo","DailyInfoSoap12");  	ТипWSПараметра = Прокси.ФабрикаXDTO.Пакеты.Получить("http://web.cbr.ru/").Получить("GetCursOnDate"); 
 	WSПараметр = Прокси.ФабрикаXDTO.Создать(ТипWSПараметра); 
 	WSПараметр.On_Date = ТекущаяДата();                    
 	КурсыВалют = Прокси.GetCursOnDate(WSПараметр); 
 	 
 	Для каждого Элемент Из КурсыВалют.GetCursOnDateResult.diffgram.ValuteData.ValuteCursOnDate   
 	 	Цикл Валюта = СоздатьПолучитьВалюту(Элемент); 
 	 	Если Валюта <> Неопределено Тогда МенеджерКурсыВалют = 
РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(); 
 	 	 	МенеджерКурсыВалют.Валюта = Валюта; 
 	 	 	МенеджерКурсыВалют.Курс = Элемент.Vcurs; 
 	 	 	МенеджерКурсыВалют.Период = ТекущаяДата(); 
 	 	 	МенеджерКурсыВалют.Записать(); 
 	 	КонецЕсли; 
 	КонецЦикла; 
КонецПроцедуры // ЗагрузитьКурсыВалют() 
 
&НаСервере 
Функция СоздатьПолучитьВалюту(Элемент) 
 	Валюта = Справочники.Валюта.НайтиПоКоду(Элемент.Vcode); 
 	Если Валюта <> Неопределено И Валюта = Справочники.Валюта.ПустаяСсылка()  Тогда 
 	 	ВалютаОбъект = Справочники.Валюта.СоздатьЭлемент(); 
 	 	ВалютаОбъект.Наименование = Элемент.Vname; 
	 	ВалютаОбъект.Код = Элемент.Vcode; 
	 	ВалютаОбъект.Записать(); 
Возврат ВалютаОбъект.Ссылка; 
ИначеЕсли ЗначениеЗаполнено(Валюта) Тогда 
 	Возврат Валюта; 
Иначе 
 	Возврат Неопределено; 
 	КонецЕсли; 
КонецФункции // СоздатьПолучитьВалюту()

Фильтрация в форме списка

Реквизит формы списка Фильтрация с типом ПеречислениеСсылка.КачествоМатериаловИФурнитуры.

Всего материалов, количество, общая стоимость – только просмотр.

&НаКлиенте 
Процедура ФильтрацияПриИзменении(Элемент) 
 	Список.Отбор.Элементы.Очистить(); 
 	ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); 
 	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Качество"); 
 	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; 
 	ЭлементОтбора.ПравоеЗначение = Фильтрация; 
ПолучитьИтог(); 
КонецПроцедуры 
 
&НаКлиенте 
Процедура ПоказатьВсе(Команда) 
 	Список.Отбор.Элементы.Очистить(); 
 	Фильтрация = ""; 
 	ПолучитьИтог(); 
КонецПроцедуры 
 
&НаСервере 
Процедура ПолучитьИтог() 
 	Если НЕ Фильтрация.Пустая() Тогда 
 	 	Запрос = Новый Запрос; 
 	 	Запрос.Текст =  
 	 	"ВЫБРАТЬ 
 	 	| 	СУММА(Материал.Количество) КАК Количество, 
 	 	| 	СУММА(Материал.ЗакупочнаяСтоимость) КАК ЗакупочнаяСтоимость, 
 	 	| 	КОЛИЧЕСТВО(Материал.Код) КАК ВсегоМатериалов 
 	 	|ИЗ 
 	 	| 	Справочник.Материал КАК Материал 
 	 	|ГДЕ 
 	 	| 	Материал.Качество = &Качество"; 
 	 	Запрос.УстановитьПараметр("Качество", Фильтрация); 
 	 	РезультатЗапроса = Запрос.Выполнить().Выгрузить(); 
 	 	ВсегоМатериалов = РезультатЗапроса[0].ВсегоМатериалов;  
 	 	ОбщаяЗакупочнаяСтоимость = РезультатЗапроса[0].ЗакупочнаяСтоимость; 
 	 	КоличествоМатериалов = РезультатЗапроса[0].Количество; 
 	Иначе 
 	 	Запрос = Новый Запрос;  	 	Запрос.Текст =  
	 	"ВЫБРАТЬ 
	 	| 	СУММА(Материал.Количество) КАК Количество, 
	 	| 	СУММА(Материал.ЗакупочнаяСтоимость) КАК ЗакупочнаяСтоимость, 
 	 	| 	КОЛИЧЕСТВО(Материал.Код) КАК ВсегоМатериалов 
 	 	|ИЗ 
 	 	| 	Справочник.Материал КАК Материал"; 
 	 	Запрос.УстановитьПараметр("Качество", Фильтрация); 
 	 	РезультатЗапроса = Запрос.Выполнить().Выгрузить(); 
 	 	ВсегоМатериалов = РезультатЗапроса[0].ВсегоМатериалов;  
 	 	ОбщаяЗакупочнаяСтоимость = РезультатЗапроса[0].ЗакупочнаяСтоимость; 
 	 	КоличествоМатериалов = РезультатЗапроса[0].Количество; 
 	КонецЕсли; 
КонецПроцедуры // ПолучитьИтог()   
&НаСервере 
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) 
 	ПолучитьИтог(); 
КонецПроцедуры 

Загрузка файла в табличную часть (Из документа Заказ)

Справочник. Изделие 
Реквизиты: Файл (хранилище значений), имя файла, расширение (строка, неогр.) Реквизиты формы: Путь к файлу,Имя файла диалог, расширение файла диалог Команды: Загрузить файл, открыть файл.

image.png

image.png

Вставка картинки в форму списка, в зависимости от значения.

Добавить перечисление, вывести на форму списка. Переписать запрос формы списка. Поставить галку «Произвольный запрос», открыть настройку списка. Конструктор запроса – добавить новое поле с оператором ВЫБОР. Добавить реквизит на форму и выбрать значение картинки.

image.png

Регистрация пользователей в справочник.

image.png

Уник. Идент – хранилище значений. 
&НаСервере 
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) 
 	//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА 
 	// Данный фрагмент построен конструктором. 
 	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! 
 	 
 	Запрос = Новый Запрос; 
 	Запрос.Текст =  
 	 	"ВЫБРАТЬ 
 	 	| 	Пользователи.Логин КАК Логин, 
 	 	| 	Пользователи.УникальныйИдентификатор КАК УникальныйИдентификатор 
 	 	|ИЗ 
 	 	| 	Справочник.Пользователи КАК Пользователи 
 	 	|ГДЕ 
 	 	| 	Пользователи.Логин = &Логин"; 
 	 
 	Запрос.УстановитьПараметр("Логин", Объект.Логин); 
 	 
 	Результат = Запрос.Выполнить().Выбрать(); 	 
 	Если Результат.Следующий() Тогда 
  Если Результат.Количество() = 0 ИЛИ ТекущийОбъект.УникальныйИдентификатор = Результат.УникальныйИдентификатор Тогда 
 	 	 	 ПользовательСсылка = 
ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(ТекущийОбъект.УникальныйИдентификат ор); 
 	 	 	 Если ПользовательСсылка = Неопределено  Тогда 
 	 	 	 	 НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя(); 
 	 	 	 	 НовыйПользователь.Имя = Объект.Логин; 
 	 	 	 	 НовыйПользователь.Пароль = Объект.Пароль; 
 	 	 	 	 НовыйПользователь.ПолноеИмя = Объект.Наименование; 
 	 	 	 	 Если Объект.Роль = Перечисления.Роль.Администратор Тогда 
 	 	 	 	 	 НовыйПользователь.Роли.Добавить(МетаДанные.Роли.Администратор); 
 	 	 	 	 ИначеЕсли Объект.Роль = Перечисления.Роль.МенеджерПоЗакупкам Тогда 
 	 	 	 	 	 НовыйПользователь.Роли.Добавить(МетаДанные.Роли.МенеджерПоЗакупкам); 
 	 	 	 	 ИначеЕсли Объект.Роль = Перечисления.Роль.МенеджерПоПродажам Тогда 
 	 	 	 	 	 НовыйПользователь.Роли.Добавить(МетаДанные.Роли.МенеджерПоПродажам); 
 	 	 	 	 ИначеЕсли Объект.Роль = Перечисления.Роль.Мастер Тогда 
 	 	 	 	 	 НовыйПользователь.Роли.Добавить(МетаДанные.Роли.Мастер); 
 	 	 	 	 КонецЕсли;  
 	 	 	 	 НовыйПользователь.ПоказыватьВСпискеВыбора = Ложь; 
 	 	 	 	 ПользовательСсылка.Записать();  
 	 	 	 	 ТекущийОбъект.УникальныйИдентификатор = 
НовыйПользователь.УникальныйИдентификатор; 
 	 	 	 Иначе 
 	 	 	 	 ПользовательСсылка.Пароль = Объект.Пароль; 
 	 	 	 	 ПользовательСсылка.ПолноеИмя = Объект.Наименование; 
 	 	 	 	 ПользовательСсылка.Роли.Очистить(); 
 	 	 	 	 Если Объект.Роль = Перечисления.Роль.Администратор Тогда 
 	 	 	 	 	 ПользовательСсылка.Роли.Добавить(МетаДанные.Роли.Администратор); 
 	 	 	 	 ИначеЕсли Объект.Роль = Перечисления.Роль.МенеджерПоЗакупкам Тогда 
 	 	 	 	 	 ПользовательСсылка.Роли.Добавить(МетаДанные.Роли.МенеджерПоЗакупкам); 
 	 	 	 	 ИначеЕсли Объект.Роль = Перечисления.Роль.МенеджерПоПродажам Тогда 
 	 	 	 	 	 ПользовательСсылка.Роли.Добавить(МетаДанные.Роли.МенеджерПоПродажам); 
 	 	 	 	 ИначеЕсли Объект.Роль = Перечисления.Роль.Мастер Тогда 
 	 	 	 	 	 ПользовательСсылка.Роли.Добавить(МетаДанные.Роли.Мастер); 
 	 	 	 	 КонецЕсли; 
 	 	 	 	 ПользовательСсылка.Записать(); 
 	 	 	 КонецЕсли; 
 	 	 Иначе 
 	 	 	 Сообщение = Новый СообщениеПользователю; 
 	 	 	 Сообщение.Текст = "Пользователь с таким логином уже существует!"; 
 	 	 	 Сообщение.Сообщить(); 
 	 	 	 Отказ = Истина; 
 	 	КонецЕсли; 
 	Иначе  
 	 	НовыйПользователь = ПользователиИнформационнойБазы.СоздатьПользователя(); 
 	 	НовыйПользователь.Имя = Объект.Логин; 
 	 	НовыйПользователь.Пароль = Объект.Пароль; 
 	 	НовыйПользователь.ПолноеИмя = Объект.Наименование; 
 	 	Если Объект.Роль = Перечисления.Роль.Администратор  Тогда 
 	 	 	НовыйПользователь.Роли.Добавить(МетаДанные.Роли.Администратор); 
 	 	ИначеЕсли Объект.Роль = Перечисления.Роль.МенеджерПоЗакупкам Тогда 
 	 	 	НовыйПользователь.Роли.Добавить(МетаДанные.Роли.МенеджерПоЗакупкам); 
 	 	ИначеЕсли Объект.Роль = Перечисления.Роль.МенеджерПоПродажам Тогда 
 	 	 	НовыйПользователь.Роли.Добавить(МетаДанные.Роли.МенеджерПоПродажам); 
 	 	ИначеЕсли Объект.Роль = Перечисления.Роль.Мастер Тогда 
 	 	 	НовыйПользователь.Роли.Добавить(МетаДанные.Роли.Мастер); 
 	 	КонецЕсли; 
 	 	НовыйПользователь.ПоказыватьВСпискеВыбора = Ложь; 
 	 	НовыйПользователь.Записать(); 
  ТекущийОбъект.УникальныйИдентификатор = НовыйПользователь.УникальныйИдентификатор;  КонецЕсли; 
КонецПроцедуры 

Заполнение табличной части данными из регистра

&НаСервере
Процедура ЗаполнитьНаСервере()
	Объект.Начисления.Очистить();
		//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ГрафикРаботыСотрудникаСрезПоследних.ФИО КАК ФИО,
		|	ГрафикРаботыСотрудникаСрезПоследних.График КАК График
		|ИЗ
		|	РегистрСведений.КадроваяИнформация.СрезПоследних КАК КадроваяИнформацияСрезПоследних
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ГрафикРаботыСотрудника.СрезПоследних КАК ГрафикРаботыСотрудникаСрезПоследних
		|		ПО КадроваяИнформацияСрезПоследних.ФИО = ГрафикРаботыСотрудникаСрезПоследних.ФИО
		|ГДЕ
		|	КадроваяИнформацияСрезПоследних.Уволен = &Ложь";
	
	Запрос.УстановитьПараметр("Ложь", Ложь);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
	
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	НоваяСтрока=Объект.Начисления.Добавить();
	НоваяСтрока.Сотрудник=ВыборкаДетальныеЗаписи.ФИО;
	НоваяСтрока.ГрафикРаботы=ВыборкаДетальныеЗаписи.График;
	НоваяСтрока.ДатаНачала=ДатаНачала;
	НоваяСтрока.Датаокончания=Датаокончания;
	НоваяСтрока.ВидРасчета=ВидРасчета;
	Если ВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда
		НоваяСтрока.Начислено=МодульФункций.ПолучитьОклад(ДатаОкончания,МодульФункций.ПолучитьДолжность(ДатаОкончания,НоваяСтрока.Сотрудник));
		КонецЕсли;
	КонецЦикла;
	
	//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

КонецПроцедуры

&НаКлиенте
Процедура Заполнить(Команда)
	ЗаполнитьНаСервере();
КонецПроцедуры

Модуль проведения расчетов при начислении заработной платы

Процедура РассчитатьНачисления(НаборЗаписейРегистра, ТребуемыйВидРасчета,
СписокСотрудников) Экспорт
Регистратор = НаборЗаписейРегистра.Отбор.Регистратор.Значение;
// Рассчитать первичные записи
Если ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда 
	Запрос = Новый Запрос;
Запрос.Текст =
 "ВЫБРАТЬ
| НачисленияДанныеГрафика.ЗначениеПериодДействия КАК Норма,
 | НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК Факт,
| НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки
|ИЗ
| РегистрРасчета.Начисления.ДанныеГрафика(Регистратор = &Регистратор И
| ВидРасчета = &ВидРасчета И Сотрудник В (&СписокСотрудников))
| КАК НачисленияДанныеГрафика";
Запрос.УстановитьПараметр("Регистратор", Регистратор);
Запрос.УстановитьПараметр("ВидРасчета", ТребуемыйВидРасчета);
Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников);
ВыборкаРезультата = Запрос.Выполнить().Выбрать();
Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл
СтруктураНомер = Новый Структура("НомерСтроки");
СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки;
ВыборкаРезультата.Сбросить();
Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда
Если ВыборкаРезультата.Норма = 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Вид расчета: Оклад –Нет рабочих дней в заданном периоде";
Сообщение.Сообщить();
ЗаписьРегистра.Результат = 0;
Иначе
// Рассчитать оклад по фактическому периоду и исходным данным
ЗаписьРегистра.Результат = (ЗаписьРегистра.ИсходныеДанные/
ВыборкаРезультата.Норма) * ВыборкаРезультата.Факт;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Выполнен расчет " + ЗаписьРегистра.Регистратор
+ " – " + ЗаписьРегистра.ВидРасчета + " – " +
ЗаписьРегистра.Сотрудник;
Сообщение.Сообщить();
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Рассчитать вторичные записи
ИначеЕсли ТребуемыйВидРасчета = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда
Запрос = Новый Запрос;
Запрос.Текст =
 "ВЫБРАТЬ
| НачисленияБазаНачисления.РезультатБаза КАК База,
| НачисленияБазаНачисления.НомерСтроки КАК НомерСтроки
|ИЗ
| РегистрРасчета.Начисления.БазаНачисления(&ИзмеренияОсновного,
| &ИзмеренияБазового, , Регистратор =
| &Регистратор И ВидРасчета = &ВидРасчета И
| Сотрудник В (&СписокСотрудников))
| КАК НачисленияБазаНачисления";
Измер = Новый Массив(1);
Измер[0] = "Сотрудник";
Запрос.УстановитьПараметр("ИзмеренияОсновного", Измер);
Запрос.УстановитьПараметр("ИзмеренияБазового", Измер);
Запрос.УстановитьПараметр("Регистратор", Регистратор);
Запрос.УстановитьПараметр("ВидРасчета", ТребуемыйВидРасчета);
Запрос.УстановитьПараметр("СписокСотрудников", СписокСотрудников);
ВыборкаРезультата = Запрос.Выполнить().Выбрать();
Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл
СтруктураНомер = Новый Структура("НомерСтроки");
СтруктураНомер.НомерСтроки = ЗаписьРегистра.НомерСтроки;
ВыборкаРезультата.Сбросить();
Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда
ЗаписьРегистра.Результат = ВыборкаРезультата.База * (10 / 100);
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Выполнен расчет " + ЗаписьРегистра.Регистратор + " – " +
ЗаписьРегистра.ВидРасчета + " – " + ЗаписьРегистра.Сотрудник;
Сообщение.Сообщить();
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры

Тестирование

Для тестирования понадобиться 2 базы: Клиент тестирование (копия рабочей базы) и менеджер тестирования(пустая). 
Переименовать базы для удобства. 
Менеджер тестирование – в параметрах Запуск 1С – дополнительное – галка запускать как менеджер тестирования.  Свойства конфигурации: 

image.png

Создать обработку ЗапускТестов, сделать форму как на картинке. У реквизитов кнопка выбора - Да. 

image.png

С базы клиент тестирование сделать действия, которые необходимые для теста в режиме запуска журнала записей. Сохранить файл и открыть с помощью внешней обработки в конфигураторе базы менеджер тестирования и использовать для заполнения кода для кнопки.

Отчет

image.png

Спецификация

Документ,в форме списка код,наим,ссылка

image.png

Все выше – справочник изделие форма списка

image.png

Форма документа

image.png