Не очень давно в Телеграм на канале 1С:БСП (https://t.me/learn_ssl1c) была опубликована заметка по использованию Графиков работы и Календарных графиков. Пример был предоставлен из документации БСП к этой подсистеме. Попробовал разобраться как все же можно использовать данную подсистему в работе. Пример буду делать на основе типовой УТ11.
Работа со справочником Графики работы доступно НСИ и Администрирование - Графики работы.
Рассмотрим пример - десяток складов и у каждого склада свой график приемки товаров. Нам потребуется создать свой график для каждого склада и определить ближайшую дату доставки.
Справочник графики работы не является подчиненным, но в нем есть реквизит определяющий владельца. Если посмотреть на реквизиты справочника Календари, можно найти реквизит ВладелецГрафика (Служебный реквизит для связи с владельцем графика работы).
Посмотрев по коду, механизмов заполнения это реквизита нет. Через интерфейс он так же не заполняется.
При открытии формы списка справочника графиков на нее накладывается отбор на Владельца где он не заполнен.
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
Список, "ВладелецГрафика", , ВидСравненияКомпоновкиДанных.НеЗаполнено, , ,
РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный);
Если попробовать выбрать например График работы из формы элемента справочника склады (НСИ и администрирование - Склады и магазины) мы получим все доступные графики независимо есть в них владелец или нет. При создании нового элемента справочника ВладелецГрафика заполнен не будет.
Попробуем доработать механизм выбора и создания новых графиков. Для этого добавим новый реквизит КалендарьПриемки с типом - СправочникСсылка.Календари
На событие НачалоВыбора поля КалендарьПриемки напишем следующее:
&НаКлиенте
Процедура КалендарьПриемкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", Новый Структура("ВладелецГрафика", Объект.Ссылка));
ОповещениеФормы = Новый ОписаниеОповещения("ОбработкаВыбораКалендаряИзСправочника", ЭтотОбъект);
ОткрытьФорму("Справочник.Календари.ФормаВыбора", ПараметрыФормы, ЭтотОбъект,,,, ОповещениеФормы);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаВыбораКалендаряИзСправочника(Результат, ДополнительныеПараметры) Экспорт
Если Результат <> Неопределено Тогда
Объект.КалендарьПриемки = Результат;
КонецЕсли;
КонецПроцедуры
теперь на форму в явном виде передается отбор списка по владельцу графика и не видны графики у которых не заполнен владелец или владельцем является другой объект. При передаче отбора на форму списка нам становится доступны ДанныеЗаполнения в процедуре модуля объекта ОбработкаЗаполнения.
В модуле объекта Календари создадим процедуру:
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда
Если ДанныеЗаполнения.Свойство("ВладелецГрафика") И ЗначениеЗаполнено(ДанныеЗаполнения.ВладелецГрафика) Тогда
ВладелецГрафика = ДанныеЗаполнения.ВладелецГрафика;
Наименование = СтрШаблон("График %1", ДанныеЗаполнения.ВладелецГрафика.Наименование);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Теперь при создании нового календаря из формы выбора сразу заполняется владелец и наименование по шаблону.
Интерфейсная часть готова.
Например у нас дни приемки товаров по субботам.
На форме документа ЗаказНаПеремещение создадим команду ПолучитьБлижайшуюДату
&НаКлиенте
Процедура ПолучитьБлижайшуюДату(Команда)
ПолучитьБлижайшуюДатуНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПолучитьБлижайшуюДатуНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Календари.Ссылка КАК Ссылка
|ИЗ
| Справочник.Календари КАК Календари
|ГДЕ
| Календари.ВладелецГрафика = &ВладелецГрафика";
Запрос.УстановитьПараметр("ВладелецГрафика", Объект.СкладПолучатель);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
МассивДат = Новый Массив;
МассивДат.Добавить(Объект.Дата);
РабочиеДни = КалендарныеГрафики.ДатыБлижайшихРабочихДней(Выборка.Ссылка, МассивДат,, Ложь);
Объект.ЖелаемаяДатаПоступления = РабочиеДни.Получить(Объект.Дата);
КонецЕсли;
КонецПроцедуры
При обработке команды она вернет ближайшую дату по графику.
Минусы реализации:
- нельзя использовать общие графики
UPD: Заполнение списка желаемых дат по графику. Например нам нужно получать три ближайшие даты поступления и выводить их в список дат.
На форме документа нужно для свойства поля - ЖелаемаяДатаПоступления установить КнопкаВыпадающегоСписка - Да
Реализовать функцию заполняющую список выбора:
&НаСервере
Процедура ЗаполнитьЖелаемыеДаты()
Элементы.ЖелаемаяДатаПоступления.СписокВыбора.Очистить();
ЖелаемаяДата = Дата(1,1,1);
КоличествоДат = 3; // количество дат представленных в списке выбора
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| Календари.Ссылка КАК Ссылка
|ИЗ
| Справочник.Календари КАК Календари
|ГДЕ
| Календари.ВладелецГрафика = &ВладелецГрафика";
Запрос.УстановитьПараметр("ВладелецГрафика", Объект.СкладПолучатель);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Выборка.Следующий();
График = Выборка.Ссылка;
Иначе
Возврат;
КонецЕсли;
Для Сч = 1 По КоличествоДат Цикл
Если ЖелаемаяДата = Дата(1,1,1) Тогда
НачальнаяДата = Объект.Дата;
Иначе
НачальнаяДата = КонецДня(ЖелаемаяДата) + 1;
КонецЕсли;
МассивДат = Новый Массив;
МассивДат.Добавить(НачальнаяДата);
РабочиеДни = КалендарныеГрафики.ДатыБлижайшихРабочихДней(График, МассивДат,, Ложь);
ЖелаемаяДата = РабочиеДни.Получить(НачальнаяДата);
Элементы.ЖелаемаяДатаПоступления.СписокВыбора.Добавить(ЖелаемаяДата, СтрШаблон("%1 (%2)", Формат(ЖелаемаяДата, "ДФ=dd.MM.yyyy") , Формат(ЖелаемаяДата, "ДФ=дддд")));
КонецЦикла;
КонецПроцедуры
Для трех событий формы реализовать обращение к этой функции (ПриСозданииНаСервере, ДатаПриИзменении, СкладПолучательПриИзменении)
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЗаполнитьЖелаемыеДаты();
КонецПроцедуры
&НаКлиенте
Процедура ДатаПриИзменении(Элемент)
ЗаполнитьЖелаемыеДаты();
КонецПроцедуры
&НаКлиенте
Процедура СкладПолучательПриИзменении(Элемент)
ЗаполнитьЖелаемыеДаты();
КонецПроцедуры
А как вы используете Графики работы?
Приложенное расширение тестировалось на платформе 8.3.13.1690 конфигурация УТ 11.4.7.150.