From 1095488c8866d380ae399308bd4897182ea9473d Mon Sep 17 00:00:00 2001 From: tsvetkoff Date: Sun, 16 Aug 2026 20:20:15 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=9F=D0=A1=5F=D0=97=D0=B0=D0=B3=D1=80=D1=83?= =?UTF-8?q?=D0=B7=D0=BA=D0=B0=D0=A2=D0=B0=D0=B1=D0=B5=D0=BB=D1=8F=D0=A3?= =?UTF-8?q?=D1=87=D1=91=D1=82=D0=B0=D0=A0=D0=B0=D0=B1=D0=BE=D1=87=D0=B5?= =?UTF-8?q?=D0=B3=D0=BE=D0=92=D1=80=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8=D0=98?= =?UTF-8?q?=D0=B7EXCEL.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Редактируемое поле "Наименование подразделения", привязка OnChange. - Списки выбора "Подразделение" и "Наименование подразделения" из ПС_НастройкиЗагрузкиТабелей с фильтром по организации. - Автоподстановка наименования подразделения, если в РС для выбранного подразделения единственное значение. - Обратная загрузка: при изменении ключевых реквизитов формы (организация, подразделение, наименование подразделения, период регистрации) поиск ранее сохранённого табеля через ПС_ЗагруженныеТабеля (последняя редакция по дате загрузки) и подтверждение пользователя при наличии данных в форме. Заполнение ТЧ — заглушка, открывает найденный табель. --- .../ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL/Forms/Форма/Form.form | 5 +- .../Forms/Форма/Module.bsl | 135 +++++++++++++++++- 2 files changed, 132 insertions(+), 8 deletions(-) diff --git a/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/DataProcessors/ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL/Forms/Форма/Form.form b/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/DataProcessors/ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL/Forms/Форма/Form.form index 90ff202..7362750 100644 --- a/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/DataProcessors/ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL/Forms/Форма/Form.form +++ b/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/DataProcessors/ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL/Forms/Форма/Form.form @@ -583,6 +583,10 @@ Объект.НаименованиеПодразделения + + OnChange + НаименованиеПодразделенияПриИзменении + НаименованиеПодразделенияРасширеннаяПодсказка 1553 @@ -599,7 +603,6 @@ true InputField - false Enter true Left diff --git a/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/DataProcessors/ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL/Forms/Форма/Module.bsl b/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/DataProcessors/ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL/Forms/Форма/Module.bsl index ad634d7..b9ce839 100644 --- a/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/DataProcessors/ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL/Forms/Форма/Module.bsl +++ b/101_ЦМСЧ_ЗиКГУ.ЗагрузкаДанныхИзExcel/src/DataProcessors/ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL/Forms/Форма/Module.bsl @@ -3309,21 +3309,26 @@ &НаКлиенте -Процедура ОрганизацияПриИзменении(Элемент) +Асинх Процедура ОрганизацияПриИзменении(Элемент) + Объект.Табель = ""; ЗаполнитьСписокВыбораПодразделений(); ОбновитьСписокЗагруженныхТабелей(); + ПриИзмененииКлючевыхРеквизитов(); КонецПроцедуры &НаКлиенте -Процедура ПодразделениеПриИзменении(Элемент) +Асинх Процедура ПодразделениеПриИзменении(Элемент) + Объект.Табель = ""; ЗаполнитьСписокВыбораНаименованийПодразделений(); + ПриИзмененииКлючевыхРеквизитов(); КонецПроцедуры &НаКлиенте -Процедура НаименованиеПодразделенияПриИзменении(Элемент) - // Редактируемое поле; дополнительной логики не требуется. +Асинх Процедура НаименованиеПодразделенияПриИзменении(Элемент) + Объект.Табель = ""; + ПриИзмененииКлючевыхРеквизитов(); КонецПроцедуры @@ -3372,6 +3377,7 @@ &НаСервере Процедура ЗаполнитьСписокВыбораНаименованийПодразделений() Элементы.НаименованиеПодразделения.СписокВыбора.Очистить(); + Объект.НаименованиеПодразделения = ""; Если НЕ ЗначениеЗаполнено(Объект.Организация) ИЛИ НЕ ЗначениеЗаполнено(Объект.Подразделение) Тогда @@ -3403,6 +3409,11 @@ Выборка.НаименованиеПодразделенияПоТабелю, Выборка.НаименованиеПодразделенияПоТабелю); КонецЦикла; + + // Если в РС для выбранного подразделения только одно наименование — подставить сразу. + Если Элементы.НаименованиеПодразделения.СписокВыбора.Количество() = 1 Тогда + Объект.НаименованиеПодразделения = Элементы.НаименованиеПодразделения.СписокВыбора[0].Значение; + КонецЕсли; КонецПроцедуры @@ -3438,10 +3449,11 @@ КонецПроцедуры &НаКлиенте -Процедура ПериодРегистрацииПриИзменении() - УчетРабочегоВремениРасширенныйКлиентСервер.ТабельУстановитьПериодДокумента(ЭтаФорма); +Асинх Процедура ПериодРегистрацииПриИзменении() + УчетРабочегоВремениРасширенныйКлиентСервер.ТабельУстановитьПериодДокумента(ЭтаФорма); ОчиститьДанные(); -КонецПроцедуры // авры() + ПриИзмененииКлючевыхРеквизитов(); +КонецПроцедуры &НаКлиенте @@ -3490,3 +3502,112 @@ ОбновитьСписокЗагруженныхТабелей(); КонецПроцедуры + +// Обратная загрузка данных из ранее сохранённого табеля (Задача 1). +// Диспетчер вызывается при изменении любого из четырёх ключевых реквизитов формы: +// Организация, Подразделение, НаименованиеПодразделения, ПериодРегистрации. +&НаКлиенте +Асинх Процедура ПриИзмененииКлючевыхРеквизитов() + Если НЕ КлючевыеРеквизитыЗаполнены() Тогда + Возврат; + КонецЕсли; + + СсылкаНаТабель = Ждать НайтиСсылкуНаТабельАсинх(); + Если НЕ ЗначениеЗаполнено(СсылкаНаТабель) Тогда + Возврат; + КонецЕсли; + + Объект.Табель = СсылкаНаТабель; + + Если ЕстьДанныеВТабличныхЧастях() Тогда + Режим = РежимДиалогаВопрос.ДаНет; + ТекстВопроса = "Найден ранее загруженный табель за " + + Формат(Объект.ПериодРегистрации, "ДФ='MMMM yyyy'") + + " по " + Строка(Объект.Подразделение) + + ". Подгрузить его данные в форму? Текущие данные будут заменены."; + Ответ = Ждать ВопросАсинх(ТекстВопроса, Режим); + Если Ответ <> КодВозвратаДиалога.Да Тогда + Возврат; + КонецЕсли; + КонецЕсли; + + ЗагрузитьДанныеТабеляВФорму(СсылкаНаТабель); +КонецПроцедуры + +&НаКлиенте +Функция КлючевыеРеквизитыЗаполнены() + Возврат ЗначениеЗаполнено(Объект.Организация) + И ЗначениеЗаполнено(Объект.Подразделение) + И НЕ ПустаяСтрока(Объект.НаименованиеПодразделения) + И ЗначениеЗаполнено(Объект.ПериодРегистрации); +КонецФункции + +&НаКлиенте +Функция ЕстьДанныеВТабличныхЧастях() + Возврат Объект.ТабличнаяЧастьСГЗ.Количество() > 0 + ИЛИ Объект.ТабличнаяЧастьПД.Количество() > 0 + ИЛИ Объект.ТабличнаяЧастьОМС.Количество() > 0; +КонецФункции + +// Заглушка Прохода А. Полная реализация заполнения ТЧ будет в Проходе Б. +&НаКлиенте +Асинх Процедура ЗагрузитьДанныеТабеляВФорму(СсылкаНаТабель) + Ждать ОткрытьЗначениеАсинх(СсылкаНаТабель); +КонецПроцедуры + +// Серверная обёртка для вызова с клиента без контекста формы. +&НаСервереБезКонтекста +Функция НайтиСсылкуНаТабельНаСервере(Организация, Подразделение, НаименованиеПодразделения, ПериодРегистрации) + Возврат НайтиСсылкуНаТабель(Организация, Подразделение, НаименованиеПодразделения, ПериодРегистрации); +КонецФункции + +&НаКлиенте +Асинх Функция НайтиСсылкуНаТабельАсинх() + Возврат Ждать НайтиСсылкуНаТабельНаСервере( + Объект.Организация, + Объект.Подразделение, + Объект.НаименованиеПодразделения, + Объект.ПериодРегистрации); +КонецФункции + +// Поиск ссылки на табель по ключевым реквизитам. +// Источник: РС ПС_ЗагруженныеТабеля.СрезПоследних (последняя редакция по ДатаЗагрузки). +// Возвращает DocumentRef.ТабельУчетаРабочегоВремени или пустую ссылку. +&НаСервереБезКонтекста +Функция НайтиСсылкуНаТабель(Организация, Подразделение, НаименованиеПодразделения, ПериодРегистрации) + Если НЕ ЗначениеЗаполнено(Организация) + ИЛИ НЕ ЗначениеЗаполнено(Подразделение) + ИЛИ ПустаяСтрока(НаименованиеПодразделения) + ИЛИ НЕ ЗначениеЗаполнено(ПериодРегистрации) Тогда + Возврат Документы.ТабельУчетаРабочегоВремени.ПустаяСсылка(); + КонецЕсли; + + Запрос = Новый Запрос; + Запрос.Текст = + "ВЫБРАТЬ + | ПС_ЗагруженныеТабеляСрезПоследних.ТабельУчетаРабочегоВремени КАК ТабельУчетаРабочегоВремени + |ИЗ + | РегистрСведений.ПС_ЗагруженныеТабеля.СрезПоследних( + | &ПериодРегистрации, + | Организация = &Организация + | И НаименованиеПодразделенияПоТабелю = &НаименованиеПодразделения + | И ПериодВводаДанныхОВремени = &ПериодВводаДанныхОВремени + | И СтруктурноеПодразделение = &СтруктурноеПодразделение) КАК ПС_ЗагруженныеТабеляСрезПоследних + |УПОРЯДОЧИТЬ ПО + | ПС_ЗагруженныеТабеляСрезПоследних.ДатаЗагрузки УБЫВ"; + Запрос.УстановитьПараметр("Организация", Организация); + Запрос.УстановитьПараметр("СтруктурноеПодразделение", Подразделение); + Запрос.УстановитьПараметр("НаименованиеПодразделения", НаименованиеПодразделения); + Запрос.УстановитьПараметр("ПериодВводаДанныхОВремени", Перечисления.ПериодыВводаДанныхОВремени.ТекущийМесяц); + Запрос.УстановитьПараметр("ПериодРегистрации", НачалоМесяца(ПериодРегистрации)); + + РезультатЗапроса = Запрос.Выполнить(); + Если РезультатЗапроса.Пустой() Тогда + Возврат Документы.ТабельУчетаРабочегоВремени.ПустаяСсылка(); + КонецЕсли; + + Выборка = РезультатЗапроса.Выбрать(); + Выборка.Следующий(); + Возврат Выборка.ТабельУчетаРабочегоВремени; +КонецФункции +