Работа с модулем 1С-Отчетность (регламентированная отчетность) часто вызывает затруднения у разработчиков, так как логика построения форм здесь существенно отличается от стандартных управляемых форм. Вместо привычных реквизитов мы видим сложный Табличный документ, ячейки которого формируются и управляются программно. В этой статье мы разберем, как локализовать проблему, изменить список доступных значений и позволить пользователю вводить произвольные данные там, где изначально это не было предусмотрено конфигурацией.
Первое заблуждение, с которым сталкиваются новички: 1С-Отчетность — это внешнее приложение. На самом деле это встроенные объекты конфигурации. Чтобы внести изменения, нам необходимо найти конкретный отчет. Обычно они располагаются в ветке Отчеты -> РегламентированныеОтчеты. Например, если речь идет об акцизах, ищите объекты с именами типа РегламентированныйОтчетАкцизыГСМ или РегламентированныйОтчетАкцизыПриложение5.
Проанализируем структуру формы такого отчета. Основным рабочим пространством является поле типа ТабличныйДокумент. Вся «красота» — разметка, цвета ячеек, списки выбора — создается динамически при открытии или при выборе определенных разделов. Чтобы понять, какая логика управляет конкретной ячейкой, нам нужно выяснить её имя. В регламентированных отчетах имена ячеек часто имеют вид П001050005003.
Когда пользователь кликает на ячейку в отчете, срабатывает событие ТабличныйДокументВыбор. Рассмотрим основной алгоритм действий для изменения ограничений:
ТабличныйДокументВыбор.Разберем пример кода, который управляет формированием списка выбора:
ИначеЕсли Область.Имя = "П001050006003" И НЕ СтруктураРеквизитовФормы.мАвтоВыборКодов Тогда
СписокКодов = Новый СписокЗначений;
СписокКодов.Добавить(0, "Значение по умолчанию");
СписокКодов.Добавить(1, "Дополнительный вариант");
// Здесь мы можем добавить свой пункт
СписокКодов.Добавить("ПроизвольныйВвод", "Ввести свое значение...");
КонецЕсли;
Как мы видим, программа жестко ограничивает выбор списком значений. Чтобы расширить возможности пользователя, нам нужно не только добавить пункт в список, но и обработать его выбор.
Просто добавить строку в СписокЗначений недостаточно, так как 1С должна знать, что делать дальше. Для этого используется механизм оповещений. Рассмотрим, как организовать цепочку действий: выбор пункта "Произвольное значение" -> открытие окна ввода числа -> запись значения в ячейку.
Для начала используем метод ПоказатьВыборИзСписка. В параметрах этого метода указывается процедура-обработчик (оповещение), которая выполнится после того, как пользователь сделает выбор.
Шаг 1: Описание оповещения при выборе из списка
Оповещение = Новый ОписаниеОповещения("ПослеВыбораИзСписка", ЭтотОбъект, НоваяСтруктураПараметров);
ПоказатьВыборИзСписка(Оповещение, СписокКодов, Область);
Шаг 2: Обработка выбора и вызов окна ввода
В процедуре ПослеВыбораИзСписка мы анализируем, что именно выбрал пользователь. Если выбран наш кастомный пункт "ПроизвольныйВвод", вызываем стандартный диалог ПоказатьВводЧисла.
Процедура ПослеВыбораИзСписка(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
Если ВыбранныйЭлемент = Неопределено Тогда
Возврат;
КонецЕсли;
Если ВыбранныйЭлемент.Значение = "ПроизвольныйВвод" Тогда
ОповещениеВвода = Новый ОписаниеОповещения("ВыбратьЧислоЗавершение", ЭтотОбъект, ДополнительныеПараметры);
ПоказатьВводЧисла(ОповещениеВвода, 0, "Введите необходимое значение ставки:");
Иначе
// Стандартная логика обработки фиксированных значений
ЗаписатьЗначениеВЯчейку(ВыбранныйЭлемент.Значение, ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
Шаг 3: Финализация ввода
В процедуре завершения нам остается только поместить введенное число в структуру данных отчета и отобразить его в табличном документе.
Процедура ВыбратьЧислоЗавершение(Число, ДополнительныеПараметры) Экспорт
Если Число <> Неопределено Тогда
// Записываем введенное число в ячейку табличного документа
ДополнительныеПараметры.Область.Значение = Число;
// Важно: нужно также обновить внутренние данные отчета (дерево значений)
ОбновитьДанныеОтчета(ДополнительныеПараметры.ИмяЯчейки, Число);
КонецЕсли;
КонецПроцедуры
При внесении подобных изменений необходимо учитывать несколько критических факторов, которые могут повлиять на работоспособность отчета и его сдачу в контролирующие органы:
ТабличногоДокумента, но и в специальных скрытых структурах (часто это дерево значений ДанныеОтчета). Если вы измените только визуальное значение в ячейке, при сохранении или печати оно может вернуться к старому варианту. Всегда ищите метод, отвечающий за синхронизацию (например, ПриИзмененииЯчейки).ТабличныйДокументВыбор с помощью аннотации &Вместо или &После.РежимРедактирования. Чтобы разрешить ввод, оно должно иметь значение Непосредственно.Таким образом, изменение ограничений в 1С-Отчетности — это задача, требующая вмешательства в программный код обработки событий табличного документа. Разберем еще раз: находим нужную область по имени, подменяем стандартный список выбора своим, добавляем обработку через ОписаниеОповещения и не забываем про обновление внутренних структур данных отчета для корректного сохранения и выгрузки.