Разработка собственной выгрузки данных из 1С в текстовый формат CSV — частая задача при интеграции системы с веб-сайтами или внешними сервисами. Разберем по шагам, как правильно составить запрос к регистру накопления, сформировать CSV-файл и избежать распространенных ошибок при разработке обработки на платформе 1С 8.2.
При получении остатков из регистров накопления часто возникает необходимость отсечь нулевые или отрицательные позиции. Проанализируем важную особенность виртуальных таблиц: в параметрах виртуальной таблицы остатков нельзя задавать условия на рассчитываемые ресурсы (например, КоличествоОстаток > 0).
Параметр «Условие» виртуальной таблицы предназначен только для отбора по измерениям и их реквизитам до выполнения вычислений. Если требуется отобрать только положительные остатки, условие следует выносить в секцию ГДЕ основного запроса:
ВЫБРАТЬ
ТоварыОстатки.Организация КАК Организация,
ТоварыОстатки.Товар КАК Номенклатура,
ТоварыОстатки.НомерГТД КАК НомерГТД,
ТоварыОстатки.КоличествоОстаток КАК Количество
ИЗ
РегистрНакопления.ТоварыОрганизацийБУ.Остатки(&Период, Организация = &Организация) КАК ТоварыОстатки
ГДЕ
ТоварыОстатки.КоличествоОстаток > 0
Частой ошибкой при передаче параметров в запрос является опечатка в наименовании параметра в коде 1С. Например, если в тексте запроса указано &Организация, а при установке параметра вызван метод Запрос.УстановитьПараметр("Огранизация", Организация), система выдаст ошибку о том, что параметр не задан. Внимательно проверяйте совпадение имен параметров.
Рассмотрим основной алгоритм формирования CSV-файла. Процесс выгрузки состоит из трех ключевых этапов:
Запрос.;, , или |).ЗаписьТекста.Посмотрим на практический пример реализации функции получения данных и их сохранения в CSV-файл:
Функция ПолучитьТаблицуОстатков(Организация)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыОстатки.Организация КАК Организация,
| ТоварыОстатки.Товар КАК Номенклатура,
| ТоварыОстатки.НомерГТД КАК НомерГТД,
| ТоварыОстатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.ТоварыОрганизацийБУ.Остатки(, Организация = &Организация) КАК ТоварыОстатки
|ГДЕ
| ТоварыОстатки.КоличествоОстаток > 0";
Запрос.УстановитьПараметр("Организация", Организация);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Процедура ВыгрузитьОстаткиВCSV(ПутьКФайлу, Организация)
ТаблицаДанных = ПолучитьТаблицуОстатков(Организация);
Разделитель = "|";
// Открываем файл для записи в кодировке UTF-8
ЗаписьФайла = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
// Сформируем заголовок файла из имен колонок
Заголовок = "";
Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
Заголовок = Заголовок + Колонка.Имя + Разделитель;
КонецЦикла;
ЗаписьФайла.ЗаписатьСтроку(Заголовок);
// Выгружаем строки данных
Для Каждого СтрокаТЗ Из ТаблицаДанных Цикл
СтрЗапись = "";
Для Каждого Колонка Из ТаблицаДанных.Колонки Цикл
СтрЗапись = СтрЗапись + Строка(СтрокаТЗ[Колонка.Имя]) + Разделитель;
КонецЦикла;
ЗаписьФайла.ЗаписатьСтроку(СтрЗапись);
КонецЦикла;
ЗаписьФайла.Закрыть();
КонецПроцедуры
Если объем выгружаемых данных велик, загрузка всех записей в объект ТаблицаЗначений может потребовать значительного объема оперативной памяти. В таких случаях эффективнее выполнять запись в файл непосредственно при обходе объекта ВыборкаИзРезультатаЗапроса:
Процедура ВыгрузитьОстаткиБыстро(ПутьКФайлу, Склад)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТоварыОстатки.Склад КАК Склад,
| ТоварыОстатки.Номенклатура КАК Номенклатура,
| ТоварыОстатки.КоличествоОстаток КАК КоличествоОстаток
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, Склад = &Склад) КАК ТоварыОстатки";
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Период", ТекущаяДата());
Выборка = Запрос.Выполнить().Выбрать();
ТекстЗапись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
Разделитель = ";";
Пока Выборка.Следующий() Цикл
СтрокаТекста = "" + Выборка.Склад + Разделитель
+ Выборка.Номенклатура + Разделитель
+ Выборка.КоличествоОстаток;
ТекстЗапись.ЗаписатьСтроку(СтрокаТекста);
КонецЦикла;
ТекстЗапись.Закрыть();
КонецПроцедуры
Проанализируем технические детали, которые необходимо учитывать при настройке выгрузки:
""Торговый дом"").ЕСТЬNULL(КоличествоОстаток, 0), чтобы в файл не попадали пустые строки вместо чисел.