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