Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
14 Дек 2017, 20:01
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Выгрузка табличной части документа в текстовый файл  (Прочитано 3844 раз)

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

Оффлайн pircuser61

  • *
  • Сообщений: 2
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2015-04-15
  • Сайт: 
  • Профессия: Ученик 1С
Доброго времени суток. Дали тестовое задание (решил податся в 1с): сохранить табличную часть накладной (товары) в текстовый файл. Типовая конфигурация УТ, изменять нельзя (сначала сказали БП 3.0 поэтому написан под неё), соответственно все делается во внешней обработке. Вобщем кое -как решил, но хотелось бы услышать критику и исправить прежде чем сдавать работу.

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


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

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

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


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

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

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

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

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

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

стандартная регистрация обработки
Функция СведенияОВнешнейОбработке() Экспорт
 
 ///////////// команды /////////////////////////
 тзКоманды = Новый ТаблицаЗначений;
 тзКоманды.Колонки.Добавить("Идентификатор");
 тзКоманды.Колонки.Добавить("Представление");
 тзКоманды.Колонки.Добавить("Модификатор");
 тзКоманды.Колонки.Добавить("ПоказыватьОповещение");
 тзКоманды.Колонки.Добавить("Использование");
 
 строкаКоманды = тзКоманды.Добавить();
 строкаКоманды.Идентификатор = "1";
 строкаКоманды.Представление = "Сохранить в файл ...";
 строкаКоманды.ПоказыватьОповещение = Истина;
 строкаКоманды.Использование = "ВызовКлиентскогоМетода";
 
 
 
///////////// назначение //////////////////////////
 МассивНазначений = Новый Массив;
 МассивНазначений.Добавить("Документ.РеализацияТоваровУслуг");

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

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


Оффлайн cska-fanat-kz

  • 1С:Специалист
  • Глобальный модератор
  • *****
  • Сообщений: 5745
  • РЕПУТАЦИЯ: 1099
  • КПД: 19%
  • Красная армия всех сильней!
  • Регистрация: 2010-11-06
    • Skype: cska-fanat-kz81
  • Сайт: cska-fanat-kz.ucoz.kz
  • Профессия: Разработчик 1С
а вам как надо?
чтобы тестовый файл был так сказать читабельный?
а то ведь есть замечательный метод ЗначениеВСтрокуВнутр()

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

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

Оффлайн pircuser61

  • *
  • Сообщений: 2
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2015-04-15
  • Сайт: 
  • Профессия: Ученик 1С
формат файла задано строго, кодировка win1251 поля по порядку,разделенные ";"

Оффлайн LexaK

  • *****
  • Сообщений: 1267
  • РЕПУТАЦИЯ: 347
  • КПД: 27%
  • Регистрация: 2012-05-16
  • Сайт: 
  • Профессия: Программист 1С
почитайте книжку по запросам 1С, вы совсем их не умеете писать
 
не надо левым соединением присоединять основную таблицу документа, все реквизиты документы доступны через поле Ссылка через точку,
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
| ПО РеализацияТоваровУслугТовары.Ссылка = РеализацияТоваровУслуг.Ссылка
|ГДЕ
| РеализацияТоваровУслуг.Номер = &Номер";


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

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


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

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


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

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

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

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

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

удачи в нелегком деле освоения 1С,
с книжкой и разбором примеров, это будет проще и понятнее.
Помогло? - Нажми СПАСИБО!!!
                       :)

Оффлайн Dethmontt

  • Денис
  • Модератор
  • *****
  • Сообщений: 2857
  • РЕПУТАЦИЯ: 546
  • КПД: 19%
  • Адын Эс
  • Регистрация: 2010-11-01
  • Сайт: 
  • Профессия: Программист 1С
не надо левым соединением присоединять основную таблицу документа
поэтому для получиения дополнительных данных их этих элементов не надо левым соединением присоединять соответствующий справочник, достаточно через точку обращаться к соответствующему реквизиту, пример:

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


Теги:
 

Не открывает форму сохраненного документа, открывает форму нового.

Автор EHOTРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 1
Просмотров: 4473
Последний ответ 13 Апр 2012, 23:26
от Vit1501
Добавление сведений в графу "основание" документа "ТОРГ-12"

Автор Ярослав1984Раздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 4
Просмотров: 7742
Последний ответ 20 Авг 2013, 18:45
от Ярослав1984
"Не совпадают сумма документа и общая сумма по платежным ведомостям"

Автор yunovoРаздел Пользователям "1С - Предприятие 8"

Ответов: 1
Просмотров: 4780
Последний ответ 11 Янв 2015, 02:55
от MuI_I_Ika
При создании нового документа "Заявка на кассовый расход" Ошибка "Значение 9 поля "номер" не уникально

Автор ppkmliteРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 14
Просмотров: 8509
Последний ответ 22 Ноя 2014, 04:50
от cska-fanat-kz
Фамилия руководителя в печатных формах документа "Акт сверки", "Акт об оказании"

Автор MKozzlikРаздел Пользователям "1С - Предприятие 8"

Ответов: 1
Просмотров: 7343
Последний ответ 03 Фев 2012, 17:27
от Dinah

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

Смотрите бесплатно более 300 видеоуроков по работе в 1С:Бухгалтерия 8 и 1C:ЗУП 8 ред. 3.0

СМОТРЕТЬ >>

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
184 Сообщений
ilyay ilyay
75 Сообщений
oleg-x
51 Сообщений
alex0402
50 Сообщений
andron81_81
40 Сообщений
AIFrame
37 Сообщений
MuI_I_Ika MuI_I_Ika
34 Сообщений
BuhRust
30 Сообщений
Golickoff Golickoff
29 Сообщений
Dima Dddd Dima Dddd
26 Сообщений

* Кто онлайн

  • Точка Гостей: 342
  • Точка Скрытых: 0
  • Точка Пользователей: 5
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal