Графики работы из БСП

23.05.19

Разработка - БСП (Библиотека стандартных подсистем)

Не очень давно на канале 1С:БСП была опубликована заметка по использованию Графиков работы и Календарных графиков.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Расширение реализующее список дат
.cfe 57,65Kb
2
2 Скачать (1 SM) Купить за 1 850 руб.

Не очень давно в Телеграм на канале 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.

См. также

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

В статье описан алгоритм для включения документа или справочника в систему БСП. Будет полезно программистам 1С, начинающим работать с БСП.

24.10.2024    1088    PROSTO-1C    0    

12

БСП (Библиотека стандартных подсистем) Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

В материале описан универсальный механизм работы с добавленными элементами на общую форму «ФормаОтчета». Думаю, облегчит работу многим разработчикам.

08.10.2024    978    PROSTO-1C    4    

10

БСП (Библиотека стандартных подсистем) Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В статье рассмотрим пошаговую инструкцию создания дополнительного отчета с фоновым формированием результата.

04.10.2024    1830    MadRave    11    

24

БСП (Библиотека стандартных подсистем) Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример отслеживания прогресса фонового выполнения дополнительной обработки с использованием программного интерфейса длительных операций БСП.

10.09.2024    1819    MadRave    1    

17

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

А что, если долгожданная реализация Паузы в 1С смутно напоминает старую, проверенную? А?!

06.09.2024    1254    n_mezentsev    10    

8

БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Добавим дополнительные свойства в новый документ средствами БСП

02.09.2024    4105    John_d    10    

52

БСП (Библиотека стандартных подсистем) Программист Платформа 1С v8.3 Бесплатно (free)

Всё больше организаций выбирает для серверов под 1С операционные системы Linux. Одним из отличий систем Windows и Linux является отсутствие COM объектов, которые зачастую использовались для формирования печатных форм офисных документов (Word). Конечно, можно выполнять печать и на клиенте, но есть риск импортозамещения. В работе у меня случались проблемы с зависанием процесса Word, поэтому я не люблю его использовать.

29.07.2024    5354    PROSTO-1C    12    

52
Оставьте свое сообщение