Передача данных в обработку 1С 8.3: выделенные строки, параметры, Excel и запрос
Содержание
Передать данные в обработку 1С можно четырьмя путями: выделить строки в списке и вызвать команду обработки (ссылки придут массивом в ПараметрКоманды), передать структуру в параметры формы через ОткрытьФорму(), вставить таблицу в поле табличного документа или собрать набор запросом прямо внутри обработки. Для внешней обработки в типовых конфигурациях есть ещё регистрация в справочнике дополнительных обработок — тогда объекты назначения приходят в обработку сами.
Пользователю обычно хватает выделения строк и вставки таблицы из Excel. Программисту чаще нужны параметры формы и временное хранилище: именно там передача ломается на типах, границе клиента и сервера и безопасном режиме.
Какой способ передачи данных выбрать
Сначала определите, откуда берутся данные и кто запускает обработку. От этого зависит всё остальное.
| Способ | Кто запускает | Откуда данные | Когда подходит |
|---|---|---|---|
| Команда с выделенными строками | Пользователь | Форма списка или документа | Обработать 5–500 конкретных объектов |
| Параметры формы | Программист | Другая форма или модуль | Вызов обработки из своего кода |
Параметр запуска /C | Администратор | Командная строка, ярлык | Регламентный запуск, автоматизация |
| Табличный документ | Пользователь | Excel, буфер обмена, файл | Загрузка списков, цен, остатков |
| Запрос внутри обработки | Обработка сама | База данных | Отбор по условиям, массовые операции |
💡 Если пользователь может сформулировать условие отбора («все контрагенты без ИНН»), не заставляйте его выделять строки руками. Дайте в обработке поля отбора и соберите данные запросом.
1. Передача выделенных строк из списка в обработку
Самый понятный пользователю сценарий: выделил строки, нажал кнопку, обработка получила выбранное. Выделение — через Ctrl (по одной строке) или Shift (диапазон), всё — Ctrl+A.
Обработка в составе конфигурации
В конфигураторе у обработки создаётся команда со свойствами:
- 🔹 Тип параметра команды — например,
СправочникСсылка.Номенклатура(можно составной тип); - 🔹 Режим использования параметра —
Множественный, чтобы пришли все выделенные строки, а не одна; - 🔹 Группа — форма списка, панель навигации или командная панель формы объекта.
В модуле команды выделенные ссылки приходят массивом:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ПараметрыФормы = Новый Структура("Ссылки", ПараметрКоманды);
ОткрытьФорму("Обработка.ОбработкаНоменклатуры.Форма.Форма",
ПараметрыФормы,
ПараметрыВыполненияКоманды.Источник,
ПараметрыВыполненияКоманды.Уникальность,
ПараметрыВыполненияКоманды.Окно);
КонецПроцедуры
При режиме Однократный в ПараметрКоманды придёт одна ссылка, а не массив. Если команду переключили между режимами, а код не поменяли, обработка упадёт на первом же Для Каждого.
Внешняя обработка в типовой конфигурации
В конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3, УТ 11 и другие) внешнюю обработку регистрируют как назначаемую. Она получает объекты назначения без собственного кода выделения. Порядок для пользователя:
- Включите дополнительные обработки:
Администрирование → Печатные формы, отчеты и обработки, флажок «Дополнительные отчеты и обработки». - Откройте список «Дополнительные отчеты и обработки» там же и добавьте файл
.epfкнопкой «Добавить из файла». - В карточке на закладке команд укажите, в каких разделах и списках показывать команду, и при необходимости — пользователей.
- Откройте нужный список, выделите строки и запустите команду. Кнопка дополнительных обработок появляется на командной панели списка; в некоторых формах её прячут в меню «Ещё».
Программисту, чтобы обработка регистрировалась как назначаемая, в модуль объекта добавляют функцию регистрации:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.4.1.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиНазначаемаяОбработка();
ПараметрыРегистрации.Назначение.Добавить("Справочник.Номенклатура");
ПараметрыРегистрации.Версия = "1.0";
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Обработать выделенные";
Команда.Идентификатор = "ОбработатьВыделенные";
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Истина;
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения, ПараметрыВыполненияКоманды) Экспорт
Для Каждого Ссылка Из ОбъектыНазначения Цикл
// обработка каждого выделенного элемента
КонецЦикла;
КонецПроцедуры
Если команда открывает форму (тип «Открытие формы»), массив ссылок приходит в форму параметром ОбъектыНазначения.
Выделенные строки табличной части
Когда нужно передать не документы, а строки внутри документа, берите идентификаторы из элемента формы: Элементы.Товары.ВыделенныеСтроки. Это массив идентификаторов строк, а не самих строк. Строку получают так: Объект.Товары.НайтиПоИдентификатору(Идентификатор).
2. Как передать параметры при открытии обработки и запуске 1С
Параметры формы
Любую форму обработки можно открыть с параметрами. Два условия:
- Параметр объявлен в форме на закладке «Параметры» (имя и тип).
- Значение читается в
ПриСозданииНаСервере, пока форма ещё не показана.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("Ссылки") И ЗначениеЗаполнено(Параметры.Ссылки) Тогда
ЗаполнитьТаблицуПоСсылкам(Параметры.Ссылки);
КонецЕсли;
КонецПроцедуры
Если параметр не объявлен в форме, переданное значение пропадёт, а прямое обращение Параметры.Ссылки вызовет ошибку Поле объекта не обнаружено (Ссылки). Проверка через Параметры.Свойство() страхует от падения, но не от потери данных.
Через параметры передают только то, что живёт и на клиенте, и на сервере: примитивы, ссылки, массивы, структуры, соответствия. ТаблицаЗначений и объекты (СправочникОбъект, ДокументОбъект) на клиент не попадают. Таблицу кладут во временное хранилище, а в параметр передают адрес:
// на сервере в вызывающей форме
АдресТаблицы = ПоместитьВоВременноеХранилище(ТаблицаДанных, УникальныйИдентификатор);
// в форме обработки, ПриСозданииНаСервере
ТаблицаДанных = ПолучитьИзВременногоХранилища(Параметры.АдресТаблицы);
Возврат результата из обработки
Передача работает и в обратную сторону. Форма обработки закрывается методом Закрыть(Результат), а вызывающий код получает значение в процедуре, указанной в ОписаниеОповещения при вызове ОткрытьФорму(). Так обработка подбора отдаёт выбранные строки обратно в документ.
Параметр запуска из командной строки
Для регламентных сценариев данные передают прямо в ярлык или скрипт ключом /C:
"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" ENTERPRISE /F"D:\Bases\Buh" /N"Робот" /P"пароль" /C"Склад=Основной;Дата=20250131"
Строка после /C доступна в коде через глобальное свойство ПараметрЗапуска. Разбирать её приходится самостоятельно, например через СтрРазделить(ПараметрЗапуска, ";"). Внешнюю обработку можно открыть сразу при старте ключом /Execute "D:\Tools\Загрузка.epf".
💡 Номер версии платформы в пути подставьте свой. Пароль в ярлыке виден любому, кто откроет его свойства, поэтому для робота заведите отдельного пользователя с минимальными правами.
3. Табличный документ как источник данных для обработки
Для пользователя это самый простой путь «из Excel в обработку». На форме обработки размещают реквизит типа ТабличныйДокумент. Пользователь копирует диапазон в Excel и вставляет его в поле через Ctrl+V.
Чтение ячеек на сервере:
&НаСервере
Процедура ЗагрузитьИзТабличногоДокумента()
Для НомерСтроки = 2 По ТабДок.ВысотаТаблицы Цикл // 1-я строка — заголовки
Артикул = СокрЛП(ТабДок.Область(НомерСтроки, 1).Текст);
Если ПустаяСтрока(Артикул) Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = Товары.Добавить();
НоваяСтрока.Артикул = Артикул;
НоваяСтрока.Количество = СтрокуВЧисло(ТабДок.Область(НомерСтроки, 2).Текст);
КонецЦикла;
КонецПроцедуры
Что учесть при таком способе:
- 📌
ВысотаТаблицысчитает строки до последней заполненной. Пустые строки в середине пропускайте явно, как в примере. - 📌 Из Excel приходит текст, а не числа и даты. Типы приводите сами (см. раздел про ошибки).
- 📌 Порядок колонок пользователь может перепутать. Надёжнее найти колонки по заголовкам в первой строке, чем жёстко прописывать номера.
- 📌 Файл без копирования читается методом
Прочитать()табличного документа: передайте путь к.xlsxна сервере.
Для загрузки в типовые документы и справочники табличный документ часто не нужен: в формах подбора и в списках есть встроенная «Загрузка из файла». Своя обработка оправдана, когда нужна нестандартная логика сопоставления.
4. Программная передача набора данных через запрос
Когда данные уже есть в базе, их не нужно никуда передавать — обработка собирает их сама. Пользователь задаёт на форме только условия: период, организацию, склад.
Частая задача — соединить данные пользователя (например, загруженные артикулы) с данными базы. Таблицу значений передают в запрос параметром и кладут во временную таблицу:
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Артикул", Новый ОписаниеТипов("Строка",, Новый КвалификаторыСтроки(50)));
ТЗ.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число",, , Новый КвалификаторыЧисла(15, 3)));
// ... заполнение ТЗ
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Т.Артикул КАК Артикул,
| Т.Количество КАК Количество
|ПОМЕСТИТЬ ВТ_Загрузка
|ИЗ
| &ТаблицаЗагрузки КАК Т
|;
|ВЫБРАТЬ
| ВТ.Артикул,
| ВТ.Количество,
| Номенклатура.Ссылка КАК Номенклатура
|ИЗ
| ВТ_Загрузка КАК ВТ
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
| ПО ВТ.Артикул = Номенклатура.Артикул";
Запрос.УстановитьПараметр("ТаблицаЗагрузки", ТЗ);
Результат = Запрос.Выполнить().Выгрузить();
У колонок таблицы-параметра обязательно должны быть заданы типы. Без ОписаниеТипов запрос не выполнится: платформа не знает, какое поле создавать во временной таблице.
Строки, где после соединения Номенклатура пустая, — это артикулы, которых нет в базе. Покажите их пользователю отдельным списком, а не пропускайте молча.
Табличную часть формы обработки в запрос передают через РеквизитФормыВЗначение("Объект").Товары.Выгрузить() на сервере. Обратно результат кладут методом ЗначениеВРеквизитФормы().
5. Ошибки при передаче данных и преобразовании типов
Большая часть сбоев появляется не в самой передаче, а на стыке типов и контекстов. Короткая карта:
| Симптом | Причина | Решение |
|---|---|---|
Преобразование значения к типу Число не может быть выполнено | В ячейке пробелы, неразрывный пробел, запятая или текст | Очистить строку перед Число(), обернуть в Попытка |
| Дата приходит пустой | Дата() ждёт строку ГГГГММДДччммсс, а в Excel — 31.01.2025 | Разобрать строку на день, месяц, год |
Поле объекта не обнаружено | Параметр формы не объявлен или имя с опечаткой | Объявить параметр на закладке «Параметры» |
| В обработку пришла одна ссылка вместо массива | Режим параметра команды Однократный | Переключить на Множественный или проверять тип |
| Таблица значений не передаётся в форму | Тип недоступен на клиенте | Временное хранилище и адрес |
| Запрос по таблице-параметру падает | У колонок не заданы типы | ОписаниеТипов при создании колонок |
Безопасное приведение строки к числу:
Функция СтрокуВЧисло(Знач Текст)
Текст = СтрЗаменить(Текст, Символы.НПП, "");
Текст = СтрЗаменить(Текст, " ", "");
Текст = СтрЗаменить(Текст, ",", ".");
Попытка
Возврат Число(Текст);
Исключение
Возврат 0;
КонецПопытки;
КонецФункции
Возврат нуля удобен, но опасен: строка с ошибкой молча превратится в нулевое количество. В загрузках цен и остатков лучше копить такие строки в список ошибок и показывать пользователю номер строки и исходный текст.
Альтернатива для простых случаев — Новый ОписаниеТипов("Число").ПривестиЗначение(Значение). Метод не падает, но и не подскажет, где была ошибка.
Обработка, которая записывает объекты, должна работать в транзакции или хотя бы проверять результат записи каждого объекта. Перед первым запуском на рабочей базе сделайте резервную копию и прогоните обработку на копии.
6. Внешние обработки и расширения: что меняется при передаче данных
Внешняя обработка, подключённая из кода
Если открыть .epf через «Файл → Открыть», передать ей параметры нельзя — только ввести данные на её форме. Чтобы передать данные программно, обработку подключают:
&НаСервере
Функция ПодключитьОбработку(ДвоичныеДанныеФайла)
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанныеФайла, УникальныйИдентификатор);
Возврат ВнешниеОбработки.Подключить(Адрес, , Истина); // Истина — безопасный режим
КонецФункции
// на клиенте
ИмяОбработки = ПодключитьОбработку(ДвоичныеДанные);
ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма", Новый Структура("Ссылки", МассивСсылок));
В безопасном режиме обработке запрещены обращения к файлам на сервере, COM-объекты и привилегированный режим. Поэтому файл для загрузки передают двоичными данными через временное хранилище, а не путём к файлу.
Ещё одно отличие: при каждом подключении внешняя обработка может получить новое имя, если указано пустое. Не зашивайте имя в код, используйте возвращённое Подключить().
Обработка в расширении конфигурации
Обработка, добавленная в расширение, ведёт себя как обработка конфигурации. Работают команды с параметром, параметры форм, назначение в группы командных панелей. Безопасный режим зависит от того, как расширение подключено.
Плюс расширения: команду можно добавить на форму типового объекта, не снимая конфигурацию с поддержки. Минус: после обновления типовой конфигурации расширение нужно проверить, особенно если оно ссылается на реквизиты, которые могли переименовать.
Права пользователя
Данные передаются только в пределах прав. Если у пользователя нет права чтения справочника, обработка в обычном режиме не прочитает его элементы — даже если ссылки пришли через параметр. Дайте права ролью, а не включайте привилегированный режим по умолчанию.