Программирование в 1С

Данные формы в таблицу значений 1С: реквизит и Объект.Товары

Коротко

Для отдельного реквизита формы с типом ТаблицаЗначений получите таблицу через РеквизитФормыВЗначение, измените ее и верните через ЗначениеВРеквизитФормы. Для Объект.Товары используйте Выгрузить и Загрузить у коллекции данных формы. Все эти операции выполняйте в процедуре с директивой &НаСервере.

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

Данные формы в таблицу значений 1С: сначала различите типы

Тип, заданный в конфигураторе, и объект, доступный в модуле управляемой формы, — не одно и то же. Отдельный табличный реквизит и табличная часть основного объекта отображаются через ДанныеФормыКоллекция. Это не означает, что у коллекции на клиенте доступны все операции прикладной таблицы.

Исходная сущностьЧто используем в формеСерверный рецепт
Отдельный реквизит ТаблицаРасчета типа ТаблицаЗначенийДанныеФормыКоллекцияМетоды формы: имя реквизита → ТЗ → имя реквизита
Табличная часть Товары основного реквизита ОбъектОбъект.Товары — ДанныеФормыКоллекцияМетоды коллекции: Выгрузить → ТЗ → Загрузить
Уже полученная серверная ТаблицаЗначенийПрикладная таблица в локальной переменнойОбработка строк локальной таблицы

Пример 1: отдельный реквизит-ТЗ → расчет → форма

Подготовка. В тестовой внешней обработке создайте управляемую форму. Добавьте отдельный реквизит ТаблицаРасчета с единственным типом ТаблицаЗначений и колонками Товар (Строка 40), Количество (Число 10,0), Цена и Сумма (Число 12,2). Перенесите реквизит с колонками на форму как таблицу. Это отдельный реквизит, не Объект.Товары. Таблица и ее колонки должны разрешать редактирование и добавление строк; обработчики изменения ячеек для опыта не добавляйте.

Вручную добавьте две строки: «Блокнот», количество 2, цена 50, сумма 0; «Карандаш», количество 3, цена 20, сумма 0. Создайте команду ПересчитатьТаблицу, назначьте ей одноименный обработчик и разместите кнопку команды на форме. Вставьте весь блок в модуль этой формы.

// form-table: модуль изолированной управляемой формы обработки.
&НаКлиенте
Процедура ПересчитатьТаблицу(Команда)
    ПересчитатьТаблицуНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПересчитатьТаблицуНаСервере()
    Таблица = РеквизитФормыВЗначение("ТаблицаРасчета");
    Для Каждого СтрокаТаблицы Из Таблица Цикл
        СтрокаТаблицы.Сумма = СтрокаТаблицы.Количество * СтрокаТаблицы.Цена;
    КонецЦикла;
    ЗначениеВРеквизитФормы(Таблица, "ТаблицаРасчета");
КонецПроцедуры
РеквизитФормыВЗначение
ИмяРеквизитаСтрока: ТаблицаРасчета
ТипТип; для единственного типа необязателен, для составного обязателен
→ ТаблицаЗначений для этого реквизита

Точный ожидаемый результат после одного нажатия: те же две строки в прежнем порядке; у «Блокнота» сумма 100, у «Карандаша» сумма 60. Товар, количество и цена не меняются. Повторное нажатие дает те же суммы. Выводом служит таблица формы, сообщения в окно сообщений код не отправляет.

ЗначениеВРеквизитФормы(<Значение>, <ИмяРеквизита>) — серверная процедура без результата. Оба аргумента обязательны: совместимое прикладное значение (Произвольный) и строковое имя реквизита. Изменение локальной таблицы без обратного вызова не является обновлением реквизита формы.

Обратное преобразование обновляет данные реквизита, но ЗначениеВРеквизитФормы не обновляет флаг Модифицированность. Это не признак сохранения в базе. При адаптации к сохраняемой форме изменение этого флага предусмотрите отдельно и проверьте сценарий закрытия формы; в тестовой обработке ниже запись не выполняется. Ручной ввод мог уже установить флаг: его состояние после расчета само по себе не доказывает действие метода.

Пример 2: Объект.Товары → ТЗ → Объект.Товары

Подготовка. Создайте другую тестовую внешнюю обработку с табличной частью Товары. Ее реквизиты: Товар (Строка 40) и Количество (Число 10,0). В управляемой форме основной реквизит Объект должен иметь тип объекта этой обработки. Выведите Объект.Товары с обеими колонками на форму. Таблица и ее колонки должны разрешать редактирование и добавление строк; обработчики изменения ячеек для опыта не добавляйте.

Вручную добавьте строки «Блокнот», количество 2, и «Карандаш», количество 3. Создайте команду УдвоитьКоличество, назначьте одноименный обработчик и выведите кнопку команды. Вставьте весь блок в модуль этой формы. Ни рабочий документ, ни запись обработки в базу для примера не нужны.

// form-goods: модуль изолированной управляемой формы обработки.
&НаКлиенте
Процедура УдвоитьКоличество(Команда)
    УдвоитьКоличествоНаСервере();
КонецПроцедуры

&НаСервере
Процедура УдвоитьКоличествоНаСервере()
    ТаблицаТоваров = Объект.Товары.Выгрузить();
    Для Каждого СтрокаТаблицы Из ТаблицаТоваров Цикл
        СтрокаТаблицы.Количество = СтрокаТаблицы.Количество * 2;
    КонецЦикла;
    Объект.Товары.Загрузить(ТаблицаТоваров);
КонецПроцедуры
ДанныеФормыКоллекция.Выгрузить
Строки / ПараметрыОтбораМассив строк или Структура отбора; два варианта первого аргумента. Без аргумента — все строки
КолонкиСтрока имен через запятую; без аргумента — все колонки
→ ТаблицаЗначений

Точный ожидаемый результат после одного нажатия: две строки «Блокнот», количество 4, и «Карандаш», количество 6, в исходном порядке. До Загрузить изменена только локальная таблица, после него — коллекция формы. Повторное нажатие удвоит значения еще раз: 8 и 12. Для повторения исходного опыта заново введите 2 и 3.

Загрузить(<Таблица>) — серверная процедура; аргумент имеет тип ТаблицаЗначений и в справке помечен необязательным, здесь передается явно. Метод удаляет прежние элементы коллекции и загружает строки ТЗ по совпадающим именам колонок. Поэтому пример выгружает все колонки: при переносе рецепта в настоящую форму не подменяйте полную таблицу урезанным набором полей, иначе потеряете значения остальных колонок. Загрузка пересоздает элементы коллекции: не рассчитывайте на сохранение идентичности старых строк. Если прикладной код хранит ссылки на строки или зависит от текущей строки таблицы формы, проверяйте этот сценарий отдельно. Метод ничего не возвращает.

Почему нужен серверный контекст формы

Клиентский обработчик кнопки вызывает свою серверную процедуру без передачи ТЗ. Контекстный вызов дает серверной процедуре доступ к реквизитам формы. Измененные данные возвращаются в форму штатным механизмом платформы; локальная ТЗ остается на сервере.

Нельзя заменить директиву на &НаСервереБезКонтекста и оставить обращения к реквизитам формы: контекста формы там нет. Если требуется неконтекстная обработка, ее параметры и возврат данных проектируются отдельно.

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

Почему Выгрузить не работает

  • Вызов на клиенте. У ДанныеФормыКоллекция метод есть, но доступен на сервере. Переносите выгрузку вместе с обработкой ТЗ в контекстную серверную процедуру.
  • Другой получатель. У ТаблицыЗначений нет метода Выгрузить. У визуального элемента таблицы и у источника данных также разные API.
  • Метод формы вызван без контекста. РеквизитФормыВЗначение работает с реквизитом конкретной формы, а не произвольной глобальной переменной.
  • Смешаны имя и значение. Методы формы принимают строковое имя реквизита; методы коллекции вызываются у самой коллекции.

Частые ошибки при возврате таблицы в форму

  • Изменили локальную ТЗ, но пропустили обратную операцию: форма не обновлена.
  • Ждете добавления строк от Загрузить: метод заменяет содержимое коллекции.
  • Колонки не совпадают по именам или типам: сначала согласуйте структуру приемника и таблицы.
  • Выбрали составной тип реквизита, но не указали тип в РеквизитФормыВЗначение: возможна ошибка времени выполнения.
  • Считаете возврат данных записью документа: примеры не выполняют запись в базу и не заменяют штатный сценарий сохранения.
  • Ожидаете, что программная загрузка воспроизведет обработчики пользовательского редактирования каждой ячейки: прикладные пересчеты и проверки нужно включать в сценарий явно.

После получения ТЗ группировку выполняйте отдельно; не загружайте сгруппированный результат поверх исходной табличной части без проверки структуры и смысла данных.

Источники и границы проверки

Контракты методов сверены с оригинальными страницами локального синтакс-помощника и типовыми серверными цепочками. Независимые пояснения: HelpF: преобразования данных формы, официальный стандарт 409, официальный стандарт 628 о серверной обработке коллекции, различия ТЗ, ТЧ и данных формы и серверная выгрузка и загрузка коллекции.

Два блока написаны самостоятельно, типовые модули не копировались. Живой запуск и компиляция этих примеров пока не выполнены. Указанные результаты — точные ожидаемые значения для заданного входа, не журнал исполнения. До публикации нужен прогон в изолированных формах целевой версии 1С; сверка источников не заменяет его.

Частые вопросы

Почему Выгрузить не работает на клиенте управляемой формы?

Метод ДанныеФормыКоллекция.Выгрузить доступен на сервере. Перенесите выгрузку и обработку ТаблицыЗначений в контекстную серверную процедуру, а с клиента вызовите эту процедуру.

Можно ли одинаково обработать отдельный реквизит-ТЗ и Объект.Товары?

Оба представлены данными формы, но это разные исходные сущности. Для отдельного реквизита-ТЗ используйте РеквизитФормыВЗначение и ЗначениеВРеквизитФормы; для коллекции Объект.Товары — серверные Выгрузить и Загрузить.

Загрузить добавляет строки или заменяет их?

Загрузить удаляет прежние элементы коллекции и заполняет ее строками таблицы значений по совпадающим именам колонок. Это замена, а не добавление; запись объекта в базу этим вызовом не выполняется.

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 0,1 млн токенов на 2 дн.

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Выбрать тариф