Обработка ПС_ЗагрузкаТабеляУчётаРабочегоВремениИзEXCEL.

- Редактируемое поле "Наименование подразделения", привязка OnChange.
- Списки выбора "Подразделение" и "Наименование подразделения" из
  ПС_НастройкиЗагрузкиТабелей с фильтром по организации.
- Автоподстановка наименования подразделения, если в РС для выбранного
  подразделения единственное значение.
- Обратная загрузка: при изменении ключевых реквизитов формы (организация,
  подразделение, наименование подразделения, период регистрации) поиск
  ранее сохранённого табеля через ПС_ЗагруженныеТабеля (последняя
  редакция по дате загрузки) и подтверждение пользователя при наличии
  данных в форме. Заполнение ТЧ — заглушка, открывает найденный табель.
This commit is contained in:
tsvetkoff
2026-08-16 20:20:15 +05:00
parent 691edc541c
commit 1095488c88
2 changed files with 132 additions and 8 deletions
@@ -583,6 +583,10 @@
<dataPath xsi:type="form:DataPath"> <dataPath xsi:type="form:DataPath">
<segments>Объект.НаименованиеПодразделения</segments> <segments>Объект.НаименованиеПодразделения</segments>
</dataPath> </dataPath>
<handlers>
<event>OnChange</event>
<name>НаименованиеПодразделенияПриИзменении</name>
</handlers>
<extendedTooltip> <extendedTooltip>
<name>НаименованиеПодразделенияРасширеннаяПодсказка</name> <name>НаименованиеПодразделенияРасширеннаяПодсказка</name>
<id>1553</id> <id>1553</id>
@@ -599,7 +603,6 @@
<autoFill>true</autoFill> <autoFill>true</autoFill>
</contextMenu> </contextMenu>
<type>InputField</type> <type>InputField</type>
<readOnly>false</readOnly>
<editMode>Enter</editMode> <editMode>Enter</editMode>
<showInHeader>true</showInHeader> <showInHeader>true</showInHeader>
<headerHorizontalAlign>Left</headerHorizontalAlign> <headerHorizontalAlign>Left</headerHorizontalAlign>
@@ -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.ТабельУчетаРабочегоВремени или пустую ссылку.
&НаСервереБезКонтекста
Функция НайтиСсылкуНаТабель(Организация, Подразделение, НаименованиеПодразделения, ПериодРегистрации)
Если НЕ ЗначениеЗаполнено(Организация)
ИЛИ НЕ ЗначениеЗаполнено(Подразделение)
ИЛИ ПустаяСтрока(НаименованиеПодразделения)
ИЛИ НЕ ЗначениеЗаполнено(ПериодРегистрации) Тогда
Возврат Документы.ТабельУчетаРабочегоВремени.ПустаяСсылка();
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПС_ЗагруженныеТабеляСрезПоследних.ТабельУчетаРабочегоВремени КАК ТабельУчетаРабочегоВремени
|ИЗ
| РегистрСведений.ПС_ЗагруженныеТабеля.СрезПоследних(
| &ПериодРегистрации,
| Организация = &Организация
| И НаименованиеПодразделенияПоТабелю = &НаименованиеПодразделения
| И ПериодВводаДанныхОВремени = &ПериодВводаДанныхОВремени
| И СтруктурноеПодразделение = &СтруктурноеПодразделение) КАК ПС_ЗагруженныеТабеляСрезПоследних
|УПОРЯДОЧИТЬ ПО
| ПС_ЗагруженныеТабеляСрезПоследних.ДатаЗагрузки УБЫВ";
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("СтруктурноеПодразделение", Подразделение);
Запрос.УстановитьПараметр("НаименованиеПодразделения", НаименованиеПодразделения);
Запрос.УстановитьПараметр("ПериодВводаДанныхОВремени", Перечисления.ПериодыВводаДанныхОВремени.ТекущийМесяц);
Запрос.УстановитьПараметр("ПериодРегистрации", НачалоМесяца(ПериодРегистрации));
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Возврат Документы.ТабельУчетаРабочегоВремени.ПустаяСсылка();
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Выборка.Следующий();
Возврат Выборка.ТабельУчетаРабочегоВремени;
КонецФункции