Разработка и Конфигурация · 12 мин
Как вывести регистры на форму 1С
Как вывести регистры сведений и накопления на форму 1С: динамический список, реквизиты формы, программный вывод, настройка запроса и типичные ошибки разработчика.
Вывод данных регистра на форму — одна из базовых задач при доработке конфигураций 1С. Регистры сведений и накопления хранят основную массу учётных данных, и пользователю их нужно видеть: на форме документа, в отдельной обработке, на форме элемента справочника. Способ вывода зависит от типа регистра, версии платформы и того, нужен ли интерактивный список или просто отображение значений.
Универсального ответа «как правильно» нет: для списка записей регистра сведений подходит динамический список, для нескольких полей — реквизиты формы с программным заполнением, а для произвольной выборки из регистра накопления — таблица значений с запросом. Ниже разобраны все рабочие варианты с условиями выбора и типичными ошибками.
Какой способ вывода регистра на форму выбрать
Прежде чем открывать конфигуратор, определите, что именно должно попасть на форму. От этого зависит весь дальнейший путь. Если нужен полноценный список записей регистра с отбором, сортировкой и возможностью открытия записи — это динамический список. Если нужно показать несколько конкретных значений (например, текущий курс валюты или остаток по складу) — достаточно реквизитов формы. Если нужна произвольная выборка с группировками и итогами — таблица значений с запросом.
Второй критерий — интерактивность. Динамический список сам обновляет данные, поддерживает стандартные команды и поиск. Таблица значений статична: она заполняется в момент вызова и не обновится, пока вы не перезаполните её программно. Реквизиты формы — просто поля, которые вы заполняете вручную в коде.
Сравнение способов вывода регистра
Подходит для списка записей регистра целиком. Автообновление, отборы, сортировка. Не подходит для сложных вычисляемых колонок.
Подходит для произвольной выборки с группировками и соединениями. Требует программного обновления данных.
Подходит для вывода отдельных значений (остаток, курс, цена). Минимум настроек, но нет списка.
Подходит для редактирования движений документа прямо на его форме. Только для подчинённых регистратору регистров.
Вывод регистра сведений через динамический список
Это самый частый сценарий: показать на форме записи регистра сведений — курсы валют, цены номенклатуры, штрихкоды. Порядок действий в конфигураторе одинаков для любой формы: документа, справочника или внешней обработки.
После перетаскивания реквизита в элементы платформа автоматически создаст таблицу формы с колонками по измерениям, ресурсам и реквизитам регистра. Лишние колонки можно скрыть в свойствах элемента, а порядок — изменить перетаскиванием.
Если регистр периодический, динамический список покажет все записи по датам. Чтобы показать только актуальные значения, включите в свойствах списка произвольный запрос с виртуальной таблицей СрезПоследних — подробнее об этом в разделе про запросы.
Настройка отбора и произвольного запроса динамического списка
Редко нужно показывать весь регистр целиком. Обычно на форме документа показывают записи, связанные с этим документом или его реквизитами. Для этого используется отбор динамического списка. Его можно задать статически — в свойствах списка в конфигураторе, или динамически — в коде формы.
Для отбора по значению реквизита формы (например, по выбранной номенклатуре) удобнее параметры. Включите в свойствах динамического списка флаг «Произвольный запрос» и напишите запрос с параметром:
ВЫБРАТЬ
Цены.Номенклатура,
Цены.Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, Номенклатура = &Номенклатура) КАК Цены
Затем в модуле формы, например в обработчике ПриСозданииНаСервере, установите значение параметра:
СписокЗаписей.Параметры.УстановитьЗначениеПараметра("Номенклатура", Объект.Номенклатура);
СписокЗаписей.Параметры.УстановитьЗначениеПараметра("Период", ТекущаяДатаСеанса());
Вывод регистра накопления через таблицу значений
Динамический список плохо подходит, когда нужны итоги: остатки товаров, обороты по контрагенту, суммы продаж. Такие данные получают запросом к виртуальным таблицам регистра накопления (Остатки, Обороты, ОстаткиИОбороты) и выводят в таблицу значений на форме.
Создайте реквизит формы типа «ТаблицаЗначений», добавьте в него колонки с нужными типами (Номенклатура, Склад, Количество), перетащите реквизит в элементы формы. Затем заполните таблицу в коде:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура,
| Остатки.Склад,
| Остатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Номенклатура = &Номенклатура) КАК Остатки";
Запрос.УстановитьПараметр("Номенклатура", Объект.Номенклатура);
ОстаткиТоваров.Загрузить(Запрос.Выполнить().Выгрузить());
Помните: таблица значений не обновляется сама. Если данные в базе изменились (провели документ, изменили остатки), таблицу нужно перезаполнить — например, повторным нажатием кнопки «Обновить» или в обработчике ожидания. Динамический список в этом сценарии удобнее, если обойтись без сложных итогов.
Вывод движений документа на его форму
Частая задача — показать на форме документа записи, которые он сделал в регистре. Здесь есть два пути. Первый — динамический список с отбором по регистратору: основная таблица — регистр, в отборе поле «Регистратор» равно ссылке текущего документа. Отбор устанавливают в ПриСозданииНаСервере через ЭлементыОтбора списка или через параметр произвольного запроса.
Второй путь — вывести набор записей регистра как реквизит формы. При создании формы документа платформа может автоматически добавить реквизиты типа «набор записей» для регистров, где документ является регистратором (галочки настраиваются в конструкторе формы). Такой набор можно не только просматривать, но и редактировать, а при записи документа он запишется вместе с движениями. Это удобно для ручной корректировки движений, но требует аккуратности: пользователь получает прямой доступ к записям регистра.
Вывод отдельных значений регистра на форму
Иногда список не нужен вовсе — требуется показать одно-два значения из регистра: текущую цену товара на форме номенклатуры, курс валюты на форме документа, ответственного сотрудника из регистра сведений. Для этого добавьте на форму обычные реквизиты (Число, СправочникСсылка и т.д.), разместите их как поля и заполните программно.
Для получения значения из периодического регистра сведений удобно использовать метод менеджера регистра ПолучитьПоследнее:
Отбор = Новый Структура("Номенклатура", Объект.Ссылка);
ТекущаяЦена = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ТекущаяДатаСеанса(), Отбор).Цена;
Для остатков регистра накопления аналогично — запрос к виртуальной таблице Остатки с получением единственного поля. Такой подход дешевле по ресурсам, чем динамический список, и не требует настройки таблиц на форме. Обновление значений делайте в обработчиках изменения ключевых реквизитов или по кнопке «Обновить».
Если значение из регистра показывается на форме списка справочника у многих строк сразу, не используйте ПолучитьПоследнее в цикле — это вызовет запрос на каждую строку. Делайте один запрос с соединением к виртуальной таблице СрезПоследних по всей выборке.
Проверка результата и типичные ошибки
После настройки откройте форму в режиме 1С:Предприятие и проверьте: данные видны, отбор работает, колонки читаемы, при изменении параметров список обновляется. Если таблица пустая — чаще всего дело в отборе или параметрах, а не в самом выводе.
Как проверить результат
Записи регистра отображаются и соответствуют отбору
Таблица пустая при заведомо существующих записях в регистре
Параметры установлены до открытия списка, типы совпадают
Ошибка «Параметр не установлен» или неявное приведение типов
Форма открывается без заметной задержки
Открытие занимает секунды — вероятно, список без отбора читает весь регистр
У пользователя есть право чтения регистра
Пустая таблица только у части пользователей — проверьте роли
Отдельно стоит сказать про права. Если у пользователя нет права чтения регистра, динамический список просто покажет пустую таблицу без каких-либо ошибок — это частый источник ложных обращений «сломалась форма». Проверяйте роли до поиска ошибки в коде.
Что важно запомнить
Список записей регистра выводится динамическим списком с указанием основной таблицы, произвольная выборка с итогами — таблицей значений и запросом, отдельные значения — реквизитами формы с ПолучитьПоследнее или запросом к остаткам. Отборы и параметры устанавливайте в ПриСозданииНаСервере, а пустую таблицу проверяйте в первую очередь на отбор, параметры и права доступа.
Частые вопросы
Как вывести на форму только актуальные записи периодического регистра сведений?
Включите у динамического списка флаг «Произвольный запрос» и используйте виртуальную таблицу СрезПоследних с параметром периода. Параметр установите в ПриСозданииНаСервере, например ТекущаяДатаСеанса(). Без произвольного запроса список покажет все записи за все даты.
Почему динамический список на форме пустой, хотя записи в регистре есть?
Проверьте по порядку: указана ли основная таблица, не слишком ли жёсткий отбор, установлены ли параметры произвольного запроса и совпадают ли их типы с типами полей, есть ли у текущего пользователя право чтения регистра. Чаще всего причина — неустановленный параметр или отбор по значению другого типа.
Можно ли редактировать записи регистра прямо на форме?
Да, двумя способами. Динамический список по регистру сведений позволяет открывать и редактировать записи в отдельной форме записи. Набор записей регистра, подчинённого регистратору, можно вывести на форму документа как редактируемую таблицу — но это даёт пользователю прямой доступ к движениям, поэтому применяйте с осторожностью и ограничивайте права.
Чем отличается вывод регистра в управляемой и обычной форме?
В управляемой форме (такси, 8.3) используется динамический список как реквизит формы. В обычных формах (8.2 и ранее) применялся элемент «ТабличноеПоле» с типом источника «РегистрСведенийСписок» или «РегистрНакопленияСписок». Принцип тот же — указать таблицу и отбор, — но настраивается через свойства элемента, а не реквизита формы.
Как обновить таблицу значений на форме после изменения данных?
Таблица значений не обновляется автоматически. Вынесите заполнение таблицы в отдельную серверную процедуру и вызывайте её повторно: по кнопке «Обновить», в обработчике изменения ключевых реквизитов или через ПодключитьОбработчикОжидания с разумным интервалом. Если автообновление критично — замените таблицу динамическим списком.
Как вывести на форму остатки сразу по нескольким складам или товарам?
Используйте таблицу значений и запрос к виртуальной таблице Остатки с условием «В» по списку значений или без отбора вовсе, сгруппировав по нужным измерениям. Не делайте отдельный запрос на каждый склад или товар — один запрос с группировкой работает на порядок быстрее.