Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
16 апр 2024, 17:07

Выгрузка табличной части документа в текстовый файл

Автор pircuser61, 15 апр 2015, 20:18

0 Пользователей и 1 гость просматривают эту тему.

pircuser61

Доброго времени суток. Дали тестовое задание (решил податся в 1с): сохранить табличную часть накладной (товары) в текстовый файл. Типовая конфигурация УТ, изменять нельзя (сначала сказали БП 3.0 поэтому написан под неё), соответственно все делается во внешней обработке. Вобщем кое -как решил, но хотелось бы услышать критику и исправить прежде чем сдавать работу.

само подключение обработки к документу - получилось только через заполнение, можно ли сделать отдельно  кнопку ?


по заданию нужны дополнительные поля которых нет в форме документа, поэтому добавил серверную функцию которая получает данные через запрос и возвращает в массиве строк

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

ЗапросТабЧасть.УстановитьПараметр("Номер", НомерДокумента);
РезультатЗапроса = ЗапросТабЧасть.Выполнить();

//Добавлет требуемые поля к списку левым соединением
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенВрТабл;
Запрос.Текст =
"ВЫБРАТЬ
| СпрНоменклатура.СтранаПроисхождения,
| СпрНоменклатура.Артикул,
| ВТСписокТоваров.Номенклатура,
| ВТСписокТоваров.Количество
|ИЗ
| ВТСписокТоваров ЛЕВОЕ СОЕДИНЕНИЕ
| Справочник.Номенклатура КАК СпрНоменклатура
|ПО ВТСписокТоваров.Номенклатура=СпрНоменклатура.Ссылка";


РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

//Результат возвращает в массиве
Результат = Новый Массив;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Результат.Добавить(
ВыборкаДетальныеЗаписи.Артикул+";"+
ВыборкаДетальныеЗаписи.Номенклатура+";" +
ВыборкаДетальныеЗаписи.СтранаПроисхождения+";"+
Строка(ВыборкаДетальныеЗаписи.Количество));
КонецЦикла;

Возврат Результат;
КонецФункции
.

На клиенте определяю номер документа (можно проще?) и сохраняю результат
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
Для Каждого ДокСсылка Из ОбъектыНазначения Цикл
//Получаем номер документа
ПараметрыФормы = Новый Структура("Ключ", ДокСсылка);
ТекФорма = ПолучитьФорму("Документ.РеализацияТоваровУслуг.Форма.ФормаДокументаТовары", ПараметрыФормы);
Если ТекФорма.Открыта() Тогда
ТекФорма.Прочитать();
КонецЕсли;
ДанныеФормы = ТекФорма.Объект;
НомерДокумента = ДанныеФормы.Номер;

// Список товаров в табличной части документа с доп. полями
Рез = ПолучитьСписокДляЭкспорта (НомерДокумента);

//Сохраняем список в файл
файл = Новый ЗаписьТекста("d:\"+ДанныеФормы.Номер+".txt", "windows-1251");
Для каждого Стр из Рез Цикл
Файл.ЗаписатьСтроку(Стр);
КонецЦикла;
Файл.Закрыть();
КонецЦикла;
Сообщить("Файл сохранен");
КонецПроцедуры


стандартная регистрация обработки
Функция СведенияОВнешнейОбработке() Экспорт

///////////// команды /////////////////////////
тзКоманды = Новый ТаблицаЗначений;
тзКоманды.Колонки.Добавить("Идентификатор");
тзКоманды.Колонки.Добавить("Представление");
тзКоманды.Колонки.Добавить("Модификатор");
тзКоманды.Колонки.Добавить("ПоказыватьОповещение");
тзКоманды.Колонки.Добавить("Использование");

строкаКоманды = тзКоманды.Добавить();
строкаКоманды.Идентификатор = "1";
строкаКоманды.Представление = "Сохранить в файл ...";
строкаКоманды.ПоказыватьОповещение = Истина;
строкаКоманды.Использование = "ВызовКлиентскогоМетода";



///////////// назначение //////////////////////////
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");

//////////// Регистрация
ПараметрыРегистрации = Новый Структура;

ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта"); 
ПараметрыРегистрации.Вставить("Наименование", "Экспорт ...");
ПараметрыРегистрации.Вставить("Информация", "Экспорт табличной части в текстовый файл");
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
ПараметрыРегистрации.Вставить("Команды", тзКоманды);
Возврат ПараметрыРегистрации;
КонецФункции

cska-fanat-kz

а вам как надо?
чтобы тестовый файл был так сказать читабельный?
а то ведь есть замечательный метод ЗначениеВСтрокуВнутр()

Функция ПолучитьТЧВВидеСтроки(ТЧ)
    Возврат ЗначениеВСтрокуВнутр(ТЧ);
КонецФункции

ЗЫ дополнительный плюс - при таком хранении обратная процедура по загрузке ИЗ файла - делается на раз два.
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

pircuser61

формат файла задано строго, кодировка win1251 поля по порядку,разделенные ";"

LexaK

почитайте книжку по запросам 1С, вы совсем их не умеете писать

не надо левым соединением присоединять основную таблицу документа, все реквизиты документы доступны через поле Ссылка через точку,

|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
| ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка
|ГДЕ
| РеализацияТоваровУслуг.Номер = &Номер";


в вашем примере правильнее было бы так


|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка.Номер = &Номер";


ВНИМАНИЕ!!! отбирать документ по номеру не правильно!!! Обычно нумерация документов уникальна в пределах года, поэтому к вам в запрос могут попасть данные из документов с одинаковыми номерами но за разные года!
Для отбора документа используйте Ссылку, пример:


|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка = &Ссылка


как правило поля типа Номенклатура, Характеристика, Контрагент, Организация имеют простой (не составной) тип, поэтому для получиения дополнительных данных их этих элементов не надо левым соединением присоединять соответствующий справочник, достаточно через точку обращаться к соответствующему реквизиту, пример:


"ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Ссылка,
| РеализацияТоваровУслугТовары.НомерСтроки,
| РеализацияТоваровУслугТовары.Номенклатура,
|     РеализацияТоваровУслугТовары.Номенклатура.Артикул как Артикул,
|     РеализацияТоваровУслугТовары.Номенклатура.СтранаПроисхождения как СтранаПроисхождения,
| РеализацияТоваровУслугТовары.КоличествоМест,
...


Простые запросы лучше получать одним запросом, в вашем примере, не надо создавать временную таблицу! Сразу одним запросом получайте/возвращайте данные!
Используйте собственные имена таблиц (алиасы), для читаемости кода запроса, сравните


"ВЫБРАТЬ
| Док.Ссылка,
| Док.НомерСтроки,
| Док.Номенклатура,
| Док.Номенклатура.Артикул             как Артикул,
| Док.Номенклатура.СтранаПроисхождения как СтранаПроисхождения,
| Док.КоличествоМест,
...
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Док
...


Используйте консоль запросов, для отладки ваших запросов!

удачи в нелегком деле освоения 1С,
с книжкой и разбором примеров, это будет проще и понятнее.
если помогло нажмите: Спасибо!

Dethmontt

Цитата: LexaK от 16 апр 2015, 10:04не надо левым соединением присоединять основную таблицу документа
Цитата: LexaK от 16 апр 2015, 10:04поэтому для получиения дополнительных данных их этих элементов не надо левым соединением присоединять соответствующий справочник, достаточно через точку обращаться к соответствующему реквизиту, пример:

Ну почему же... За него это сделает платформа, а тут он сам решил сделать соединение.
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск