Как изменить ограничения и разрешить ввод произвольного значения в полях 1С-Отчетности

Программист 1С v8.3 (Управляемые формы) Налоговый учет
← На главную

Работа с модулем 1С-Отчетность (регламентированная отчетность) часто вызывает затруднения у разработчиков, так как логика построения форм здесь существенно отличается от стандартных управляемых форм. Вместо привычных реквизитов мы видим сложный Табличный документ, ячейки которого формируются и управляются программно. В этой статье мы разберем, как локализовать проблему, изменить список доступных значений и позволить пользователю вводить произвольные данные там, где изначально это не было предусмотрено конфигурацией.

Поиск объекта конфигурации и локализация проблемы

Первое заблуждение, с которым сталкиваются новички: 1С-Отчетность — это внешнее приложение. На самом деле это встроенные объекты конфигурации. Чтобы внести изменения, нам необходимо найти конкретный отчет. Обычно они располагаются в ветке Отчеты -> РегламентированныеОтчеты. Например, если речь идет об акцизах, ищите объекты с именами типа РегламентированныйОтчетАкцизыГСМ или РегламентированныйОтчетАкцизыПриложение5.

Проанализируем структуру формы такого отчета. Основным рабочим пространством является поле типа ТабличныйДокумент. Вся «красота» — разметка, цвета ячеек, списки выбора — создается динамически при открытии или при выборе определенных разделов. Чтобы понять, какая логика управляет конкретной ячейкой, нам нужно выяснить её имя. В регламентированных отчетах имена ячеек часто имеют вид П001050005003.

Анализ события выбора в табличном документе

Когда пользователь кликает на ячейку в отчете, срабатывает событие ТабличныйДокументВыбор. Рассмотрим основной алгоритм действий для изменения ограничений:

  1. Откроем модуль формы регламентированного отчета.
  2. Найдем процедуру ТабличныйДокументВыбор.
  3. Внутри этой процедуры происходит проверка имени области (ячейки), на которую нажал пользователь.

Разберем пример кода, который управляет формированием списка выбора:


ИначеЕсли Область.Имя = "П001050006003" И НЕ СтруктураРеквизитовФормы.мАвтоВыборКодов Тогда
    СписокКодов = Новый СписокЗначений;
    СписокКодов.Добавить(0, "Значение по умолчанию");
    СписокКодов.Добавить(1, "Дополнительный вариант");
    // Здесь мы можем добавить свой пункт
    СписокКодов.Добавить("ПроизвольныйВвод", "Ввести свое значение...");
КонецЕсли;

Как мы видим, программа жестко ограничивает выбор списком значений. Чтобы расширить возможности пользователя, нам нужно не только добавить пункт в список, но и обработать его выбор.

Реализация ввода произвольного значения

Просто добавить строку в СписокЗначений недостаточно, так как 1С должна знать, что делать дальше. Для этого используется механизм оповещений. Рассмотрим, как организовать цепочку действий: выбор пункта "Произвольное значение" -> открытие окна ввода числа -> запись значения в ячейку.

Для начала используем метод ПоказатьВыборИзСписка. В параметрах этого метода указывается процедура-обработчик (оповещение), которая выполнится после того, как пользователь сделает выбор.

Шаг 1: Описание оповещения при выборе из списка


Оповещение = Новый ОписаниеОповещения("ПослеВыбораИзСписка", ЭтотОбъект, НоваяСтруктураПараметров);
ПоказатьВыборИзСписка(Оповещение, СписокКодов, Область);

Шаг 2: Обработка выбора и вызов окна ввода

В процедуре ПослеВыбораИзСписка мы анализируем, что именно выбрал пользователь. Если выбран наш кастомный пункт "ПроизвольныйВвод", вызываем стандартный диалог ПоказатьВводЧисла.


Процедура ПослеВыбораИзСписка(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт
    Если ВыбранныйЭлемент = Неопределено Тогда
        Возврат;
    КонецЕсли;

    Если ВыбранныйЭлемент.Значение = "ПроизвольныйВвод" Тогда
        ОповещениеВвода = Новый ОписаниеОповещения("ВыбратьЧислоЗавершение", ЭтотОбъект, ДополнительныеПараметры);
        ПоказатьВводЧисла(ОповещениеВвода, 0, "Введите необходимое значение ставки:");
    Иначе
        // Стандартная логика обработки фиксированных значений
        ЗаписатьЗначениеВЯчейку(ВыбранныйЭлемент.Значение, ДополнительныеПараметры);
    КонецЕсли;
КонецПроцедуры

Шаг 3: Финализация ввода

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


Процедура ВыбратьЧислоЗавершение(Число, ДополнительныеПараметры) Экспорт
    Если Число <> Неопределено Тогда
        // Записываем введенное число в ячейку табличного документа
        ДополнительныеПараметры.Область.Значение = Число;
        // Важно: нужно также обновить внутренние данные отчета (дерево значений)
        ОбновитьДанныеОтчета(ДополнительныеПараметры.ИмяЯчейки, Число);
    КонецЕсли;
КонецПроцедуры

Важные технические нюансы

При внесении подобных изменений необходимо учитывать несколько критических факторов, которые могут повлиять на работоспособность отчета и его сдачу в контролирующие органы:

  1. Синхронизация с данными отчета: В регламентированной отчетности данные хранятся не только в ячейках ТабличногоДокумента, но и в специальных скрытых структурах (часто это дерево значений ДанныеОтчета). Если вы измените только визуальное значение в ячейке, при сохранении или печати оно может вернуться к старому варианту. Всегда ищите метод, отвечающий за синхронизацию (например, ПриИзмененииЯчейки).
  2. Валидация по XSD-схемам: Каждый отчет имеет формат выгрузки в XML. Эти форматы (схемы) жестко описывают, какие значения могут быть в полях. Если вы разрешите ввести число "150" там, где по закону может быть только "10" или "20", отчет успешно заполнится, но не пройдет проверку выгрузки. Вы получите ошибку о несоответствии типа или формата данных.
  3. Использование расширений: Чтобы ваши правки не пропали при очередном обновлении конфигурации (а регламентированные отчеты обновляются очень часто), используйте Расширения. Перехватывайте процедуру ТабличныйДокументВыбор с помощью аннотации &Вместо или &После.
  4. Свойства ячеек в макете: Иногда ввод заблокирован на уровне свойств макета табличного документа. Если ячейка не дает ничего ввести, проверьте программную установку свойства РежимРедактирования. Чтобы разрешить ввод, оно должно иметь значение Непосредственно.

Таким образом, изменение ограничений в 1С-Отчетности — это задача, требующая вмешательства в программный код обработки событий табличного документа. Разберем еще раз: находим нужную область по имени, подменяем стандартный список выбора своим, добавляем обработку через ОписаниеОповещения и не забываем про обновление внутренних структур данных отчета для корректного сохранения и выгрузки.

← На главную