При разработке подсистем бюджетирования или сложных аналитических отчетов разработчики часто сталкиваются с необходимостью предоставить пользователю удобный интерфейс для ввода данных. Ввод 300 и более строк через стандартную табличную часть документа или таблицу значений часто оказывается неудобным: пользователю трудно ориентироваться в структуре, не хватает наглядности и привычных инструментов автоматического пересчета итогов, как в Microsoft Excel. В этой статье мы подробно разберем, как превратить обычный макет 1С в полноценную интерактивную форму для ручного заполнения с автоматическими расчетами.
Для решения задачи нам не подходит обычная таблица значений. Мы будем использовать элемент управления «Поле табличного документа». Это мощный инструмент, который позволяет отображать макеты любой сложности непосредственно на форме документа или обработки. В отличие от статического вывода на печать, этот элемент может работать в режиме редактирования.
Рассмотрим по шагам, как настроить такой интерфейс:
ТабличныйДокумент (например, с именем БюджетТабДок).Теперь проанализируем настройку самого макета. Чтобы пользователь мог менять только нужные нам цифры, не ломая структуру (шапку и названия статей), нам необходимо настроить защиту. Разберем, как это сделать программно или в конфигураторе:
Для каждой ячейки или области, которую разрешено редактировать, необходимо установить свойство Защита в значение Ложь. Для всего остального документа свойство Защита устанавливается в Истина. Также для ячеек ввода данных рекомендуется установить свойство СодержитЗначение, чтобы платформа автоматически подставляла нужный тип данных (например, Число).
Одной из главных задач является расчет сумм по группам и общих итогов «на лету», когда пользователь меняет значение в одной из ячеек. Для этого мы будем использовать событие поля табличного документа ПриИзмененииСодержимогоОбласти. Это событие срабатывает сразу после того, как пользователь завершил ввод в ячейку.
Рассмотрим пример кода, который выполняет пересчет итогов при изменении данных:
&НаКлиенте
Процедура БюджетТабДокПриИзмененииСодержимогоОбласти(Элемент, Область)
// Получаем значение, которое ввел пользователь
ТекущееЗначение = Область.Значение;
// Если нам нужно пересчитать итог по строке или группе
// Проанализируем адрес измененной области
Адрес = Область.Имя; // Если области именованы
// Вызываем серверную процедуру для обсчета данных
РассчитатьИтогиНаСервере();
КонецПроцедуры
Важный нюанс: чтобы не «зашивать» в код жесткие адреса ячеек вроде R10C5, настоятельно рекомендуем использовать именованные области в макете. Вы можете назначить имя каждой строке (статье бюджета) и колонке (периоду). Тогда в коде мы сможем обращаться к данным по смысловым именам, что значительно упростит поддержку кода при изменении структуры макета.
Проанализируем ситуацию, когда у нас 300 строк. Чтобы расчет работал быстро, не стоит пересчитывать весь документ целиком при каждом изменении. Мы можем реализовать частичный пересчет. Для этого в макете при его формировании полезно хранить связи между ячейками. Например, в свойство ячейки ПараметрРасшифровки можно записать идентификатор группы, к которой она относится.
Посмотрим на пример функции, которая находит ячейку итога по имени статьи:
&НаСервере
Процедура РассчитатьИтогиНаСервере()
ТабДок = Объект.БюджетТабДок;
// Пример: Суммируем значения из колонок "Январь", "Февраль", "Март" в колонку "Квартал 1"
Для НомерСтроки = 5 По 305 Цикл // Предположим, это наши 300 строк
Сумма = ТабДок.Область(НомерСтроки, 2).Значение +
ТабДок.Область(НомерСтроки, 3).Значение +
ТабДок.Область(НомерСтроки, 4).Значение;
ТабДок.Область(НомерСтроки, 5).Значение = Сумма;
КонецЦикла;
КонецПроцедуры
Однако более правильным подходом будет использование метода НайтиТекст или перебор именованных областей макета. Это позволит сохранить работоспособность формы, если вы добавите новую строку в середину бюджета.
Если вы работаете в конфигурациях 1С:ERP Управление предприятием или 1С:Управление холдингом, вам не обязательно писать этот функционал с нуля. В этих системах уже существует развитая подсистема бюджетирования, основанная на документе «Экземпляр отчета» (или «Настраиваемый отчет»).
Рассмотрим основные возможности этого механизма:
Если ваша задача стоит в рамках разработки на базе ERP, рекомендуем изучить устройство справочника ВидыБюджетов и документа ЭкземплярБюджета. Это сэкономит сотни часов разработки.
Когда пользователь заполнил 300 строк макета и нажал кнопку «Записать», нам нужно сохранить эти данные. Существует два основных способа решения этой задачи:
1. Сохранение в регистры сведений/накопления.
Это наиболее правильный путь для дальнейшего анализа. При записи документа мы обходим все значимые ячейки макета и записываем их значения в оборотный регистр (например, ОборотыБюджетов) в разрезе статей, подразделений и периодов. При открытии формы нам нужно будет выполнить обратную операцию: прочитать данные из регистра и программно заполнить ячейки макета.
2. Сохранение состояния табличного документа.
Если вам важно сохранить не только цифры, но и форматирование (например, пользователь выделил какую-то строку желтым цветом), вы можете сохранить весь объект ТабличныйДокумент в реквизит документа с типом ХранилищеЗначения. Это делается следующим образом:
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// Превращаем табличный документ в хранилище значения
ТекущийОбъект.ДанныеМакета = Новый ХранилищеЗначения(Объект.БюджетТабДок);
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// Восстанавливаем табличный документ из хранилища
ДвоичныеДанные = ТекущийОбъект.ДанныеМакета.Получить();
Если ТипЗнч(ДвоичныеДанные) = Тип("ТабличныйДокумент") Тогда
Объект.БюджетТабДок = ДвоичныеДанные;
КонецЕсли;
КонецПроцедуры
Важно: Сохранение в ХранилищеЗначения удобно для визуального отображения, но такие данные невозможно использовать в запросах для построения отчетов. Поэтому оптимальным решением является комбинированный подход: сохранение цифр в регистры для отчетов и сохранение самого табдока для удобства пользователя.
Выясним, почему формы с большим количеством строк могут подтормаживать. Основная причина — постоянные вызовы сервера при каждом изменении ячейки. Чтобы минимизировать задержки, следуйте этим советам:
ТолькоПросмотр для всего документа во время массовых вычислений, чтобы интерфейс не пытался перерисовываться слишком часто.ФиксацияСверху и ФиксацияСлева. Это позволит пользователю комфортно прокручивать 300 строк, всегда видя заголовки колонок.Таким образом, реализация «Excel-подобного» интерфейса в 1С вполне возможна и является стандартной практикой для систем управленческого учета. Главное — правильно сочетать визуальные возможности ТабличногоДокумента с программной логикой обработки событий и надежным хранением данных в регистрах.