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

Автор Тема: Как коммандно добавлять и заполнять строки ТЧ в уже существующем документе?  (Прочитано 4539 раз)

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

Оффлайн TreeDogNight

  • ***
  • Сообщений: 202
  • РЕПУТАЦИЯ: 28
  • КПД: 14%
  • Регистрация: 2013-10-16
    • Skype: treedognight3
  • Сайт: www.avars.uz
  • Профессия: Программист 1С
Делаю обработку, которая создаёт в табличной части уже существующих документов строки и заполняет их с эксэлевского документа.

Вот весь код из процедуры:
Если Не ПустаяСтрока(Объект.ФайлЗагрузки) Тогда

Exel = Новый COMОбъект("Excel.Application");
Exel.Workbooks.Open(Объект.ФайлЗагрузки);


T = 2;
Пномер     = СокрЛП(Exel.Worksheets(1).Cells(T,1).Value);
СпрЕдИзм   = Справочники.ЕдиницыИзмерения;

Пока Не ПустаяСтрока(Пномер) Цикл
Пномер = СокрЛП(Exel.Worksheets(1).Cells(T,1).Value);
НомДовер = СокрЛП(Exel.Worksheets(1).Cells(T,2).Value);
НомСтр = СокрЛП(Exel.Worksheets(1).Cells(T,3).Value);
Товары = СокрЛП(Exel.Worksheets(1).Cells(T,4).Value);
ЕдИзм = СокрЛП(Exel.Worksheets(1).Cells(T,5).Value);
Колво = СокрЛП(Exel.Worksheets(1).Cells(T,6).Value);
Если ЗначениеЗаполнено(Колво) Тогда
Колво = Число(Колво);
Иначе
Колво = 1;
КонецЕсли;

                                                       
Довер = Документы.Доверенность.НайтиПоРеквизиту("НомерДоверенности","С" + НомДовер).ПолучитьОбъект();

//Заполняем ТЧ Материалы:
Довер.ТМЦ.Очистить();
ТЧ = Довер.ТМЦ.Добавить();
ТЧ.ТМЦ = "Картошка";


Довер.Записать();

T = T + 1;
КонецЦикла;

Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не выбран файл загрузки";
Сообщение.Сообщить();
КонецЕсли;

Exel.Quit();

Я думаю, что что-то неправильно я сделал в этой части:
Довер = Документы.Доверенность.НайтиПоРеквизиту("НомерДоверенности","С" + НомДовер).ПолучитьОбъект();			

//Заполняем ТЧ Материалы:
Довер.ТМЦ.Очистить();
ТЧ = Довер.ТМЦ.Добавить();
ТЧ.ТМЦ = "Картошка";


Довер.Записать();

Подскажите, в чём моя ошибка?
Cегодня не все могут провести завтрашним числом. Вернее, не только лишь все - мало кто может это сделать.


Оффлайн KrivosheevEV

  • ***
  • Сообщений: 202
  • РЕПУТАЦИЯ: 35
  • КПД: 17%
  • Регистрация: 2014-01-20
  • Сайт: 
  • Профессия: Программист 1С
Может спросишь у отладчика. Он вредный, но справедливый.

Оффлайн TreeDogNight

  • ***
  • Сообщений: 202
  • РЕПУТАЦИЯ: 28
  • КПД: 14%
  • Регистрация: 2013-10-16
    • Skype: treedognight3
  • Сайт: www.avars.uz
  • Профессия: Программист 1С
Может спросишь у отладчика. Он вредный, но справедливый.
Уже спрашивал. Все реквезиты ТЧ заполняются нормально. Проблема в том, что созданные строки ТЧ не записываются в документы.
Cегодня не все могут провести завтрашним числом. Вернее, не только лишь все - мало кто может это сделать.

Оффлайн mixqn

  • Администратор
  • *****
  • Сообщений: 1346
  • РЕПУТАЦИЯ: 166
  • КПД: 12%
  • Who is John Galt?
  • Регистрация: 2012-08-15
  • Сайт: 3gmaster.net
  • Профессия: Программист 1С
Довер = Документы.Доверенность.НайтиПоРеквизиту("НомерДоверенности","С" + НомДовер).ПолучитьОбъект();         
         
         //Заполняем ТЧ Материалы:
         Довер.ТМЦ.Очистить();
         ТЧ = Довер.ТМЦ.Добавить();
         ТЧ.ТМЦ = "Картошка";
         
         
         Довер.Записать();
все просто: выше процитированный код приводит к тому, что получается документ. содержащий ровно 1 строку - последнюю добавленную.
Чтобы добавить все строки, а не одну не нужно каждый раз в цикле очищать таб часть перед добавлением строки. Так же не нужно в цикле записывать.
Ну и чтобы сделать совсем все красиво и по уму, вам надо не напрямую их экселья в доки писать и искать их методом НайтиПоРеквизиту, а сначала из экселя все данные сложить в иаблицу значений, затем используя эту таблицу запросом выбрать сразу все документы одним запросом, а не в цикле и уже циклом по результату запроса обработать документы.

Было бы время, наваял бы для вас готовый код, но не получится ))
Попробуйте сами, опираясь на текст выше.

Оффлайн TreeDogNight

  • ***
  • Сообщений: 202
  • РЕПУТАЦИЯ: 28
  • КПД: 14%
  • Регистрация: 2013-10-16
    • Skype: treedognight3
  • Сайт: www.avars.uz
  • Профессия: Программист 1С
Я на правильном пути?)

                        КЧ = Новый КвалификаторыЧисла(12,2);
КС = Новый КвалификаторыСтроки(20);
Массив = Новый Массив;
Массив.Добавить(Тип("Строка"));
ОписТипС = Новый ОписаниеТипов(Массив, , КС);
Массив.Очистить();
Массив.Добавить(Тип("Число"));
ОписТипЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
Массив.Добавить(Тип("СправочникСсылка.ЕдиницыИзмерения"));
ОписТипЕд = Новый ОписаниеТипов(Массив, , ,КЧ);

ТЗ = Новый ТаблицаЗначений;
                        ТЗ.Колонки.Добавить("НомерДоверенности",ОписТипС,"НомерДоверенности",15);
ТЗ.Колонки.Добавить("ТМЦ", ОписТипС, "ТМЦ", 70);
ТЗ.Колонки.Добавить("ЕдИзм", ОписТипЕд, "ЕдИзм", 15);
ТЗ.Колонки.Добавить("Количество", ОписТипЧ, "Количество", 30);

                        Пока Не ПустаяСтрока(Пномер) Цикл
Пномер = СокрЛП(Exel.Worksheets(1).Cells(T,1).Value);
НомДовер = СокрЛП(Exel.Worksheets(1).Cells(T,2).Value);
НомСтр = СокрЛП(Exel.Worksheets(1).Cells(T,3).Value);
Товары = СокрЛП(Exel.Worksheets(1).Cells(T,4).Value);
ЕдИзм = СокрЛП(Exel.Worksheets(1).Cells(T,5).Value);
Колво = СокрЛП(Exel.Worksheets(1).Cells(T,6).Value);
Если ЗначениеЗаполнено(Колво) Тогда
Колво = Число(Колво);               
Иначе
Колво = 1;
КонецЕсли;

Если НЕ ЗначениеЗаполнено(Товары) Тогда
Товары = "Неизвестный товар";
КонецЕсли;

Если НЕ ЗначениеЗаполнено(ЕдИзм) Тогда
ЕдИзм = "шт";
КонецЕсли;


Стр   = ТЗ.Добавить();
Стр.НомерДоверенности = "С" + НомДовер;
Стр.ТМЦ       = Товары;
Стр.ЕдИзм       = ЕдИзм;
Стр.Количество   = Колво;

T = T + 1

КонецЦикла;
Cегодня не все могут провести завтрашним числом. Вернее, не только лишь все - мало кто может это сделать.

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

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

Оффлайн TreeDogNight

  • ***
  • Сообщений: 202
  • РЕПУТАЦИЯ: 28
  • КПД: 14%
  • Регистрация: 2013-10-16
    • Skype: treedognight3
  • Сайт: www.avars.uz
  • Профессия: Программист 1С
Сделал вот так, но все равно строки не записываются в ТЧ.

Если Не ПустаяСтрока(Объект.ФайлЗагрузки) Тогда

Exel = Новый COMОбъект("Excel.Application");
Exel.Workbooks.Open(Объект.ФайлЗагрузки);


T = 2;
Пномер     = СокрЛП(Exel.Worksheets(1).Cells(T,1).Value);
СпрЕдИзм   = Справочники.ЕдиницыИзмерения;

КЧ     = Новый КвалификаторыЧисла(12,2);
КС     = Новый КвалификаторыСтроки(20);
Массив = Новый Массив;
Массив.Добавить(Тип("Строка"));
ОписТипС  = Новый ОписаниеТипов(Массив, , КС);
Массив.Очистить();
Массив.Добавить(Тип("Число"));
ОписТипЧ  = Новый ОписаниеТипов(Массив, , ,КЧ);
Массив.Добавить(Тип("СправочникСсылка.ЕдиницыИзмерения"));
ОписТипЕд = Новый ОписаниеТипов(Массив, , ,КЧ);


ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("НомерДоверенности",ОписТипС,"НомерДоверенности",15);
ТЗ.Колонки.Добавить("ТМЦ", ОписТипС, "ТМЦ", 70);
ТЗ.Колонки.Добавить("ЕдИзм", ОписТипС, "ЕдИзм", 15);
ТЗ.Колонки.Добавить("Количество", ОписТипЧ, "Количество", 30);

Пока Не ПустаяСтрока(Пномер) Цикл
Пномер = СокрЛП(Exel.Worksheets(1).Cells(T,1).Value);
НомДовер = СокрЛП(Exel.Worksheets(1).Cells(T,2).Value);
НомСтр = СокрЛП(Exel.Worksheets(1).Cells(T,3).Value);
Товары = СокрЛП(Exel.Worksheets(1).Cells(T,4).Value);
ЕдИзм = СокрЛП(Exel.Worksheets(1).Cells(T,5).Value);
Колво = СокрЛП(Exel.Worksheets(1).Cells(T,6).Value);
Если ЗначениеЗаполнено(Колво) Тогда
Колво = Число(Колво);               
Иначе
Колво = 1;
КонецЕсли;

    Если НЕ ЗначениеЗаполнено(Товары)Тогда                                     
    Товары = "Неизвестный товар";                                             
    КонецЕсли;

Если НЕ ЗначениеЗаполнено(ЕдИзм) ИЛИ ЕдИзм = "" Тогда
ЕдИзм = "шт";
КонецЕсли;


Стр               = ТЗ.Добавить();
Стр.НомерДоверенности = "С" + НомДовер;
Стр.ТМЦ       = Товары;
Стр.ЕдИзм       = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(ЕдИзм);
Стр.Количество       = Колво;

T = T + 1

КонецЦикла;

Для каждого Стр из ТЗ Цикл

Довер = Документы.Доверенность.НайтиПоРеквизиту("НомерДоверенности", Стр.НомерДоверенности).ПолучитьОбъект();


//Заполняем ТЧ Материалы:
ТЧ = Довер.ТМЦ.Добавить();
ТЧ.ТМЦ = Стр.ТМЦ;
ТЧ.Количество = Стр.Количество;
ТЧ.ЕдИзм = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию(Стр.ЕдИзм);


Если Довер.Модифицированность() Тогда
Сообщить("Доверенность № " + Стр.НомерДоверенности + " успешно изменена");
КонецЕсли;

Довер.Записать();
КонецЦикла;

Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не выбран файл загрузки";
Сообщение.Сообщить();
КонецЕсли;

Exel.Quit();

Когда в отлатчике рассчитываю выражение "Довер.Записать()" в колонке значение пишет "{(1)}: Обращение к процедуре объекта как к функции (Записать)".
Cегодня не все могут провести завтрашним числом. Вернее, не только лишь все - мало кто может это сделать.

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

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

Правильно пишет. Вы же от процедуры Записать() пытаетесь какое-то значение получить, как от функции.

А по коду - на первый взгляд все правильно. Имеется ввиду в плане заполнения ТЧ и записи документа...

Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Оффлайн TreeDogNight

  • ***
  • Сообщений: 202
  • РЕПУТАЦИЯ: 28
  • КПД: 14%
  • Регистрация: 2013-10-16
    • Skype: treedognight3
  • Сайт: www.avars.uz
  • Профессия: Программист 1С
Сейчас через отлатчик вычислил значение "Довер.ТМЦ", и к моему удивлению там оказалось целых 9 строк, хотя в табличной части этого документа нет ни одной строчки...
Cегодня не все могут провести завтрашним числом. Вернее, не только лишь все - мало кто может это сделать.

Оффлайн mixqn

  • Администратор
  • *****
  • Сообщений: 1346
  • РЕПУТАЦИЯ: 166
  • КПД: 12%
  • Who is John Galt?
  • Регистрация: 2012-08-15
  • Сайт: 3gmaster.net
  • Профессия: Программист 1С
Не увидел принципиального изменения в алгоритме. Да, вы сначала создали таблицу значений, но потом то опять таки в цикле ищите документы, там же в цикле их записываете и там же строки добавляете. Принципиальное отличие только одно - Довер.ТМЦ.Очистить(); не стало.

Попробую объяснить еще раз :)
У вас принципиальная ошибка в алгоритме что в первом, что во втором случае - вы один документ записываете несколько раз, при чем не очистив перед заполнением таб часть. Последнее означает, что при каждой загрузке из экселя, если их будет несколько, строки будут не заменяться по файлу, а добавляться - это вполне и может быть причиной того, что у вас 9 строк в таб. части.

Как надо сделать:
1. первый шаг у вас есть - собрать данные в таблицу значений
2. выбрать все документы, которые необходимо модифицировать.
3. обрабатывать 1 документ сразу, не делая записи в цикле.

Далее есть 2 варианта решения:
1. Запросом
2. Без запроса.

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

Вариант без запроса выглядит так:
1. выгружаете колонку ("НомерДоверенности" если не ошибаюсь), по которой вы ищите доки в отдельную таблицу значений
2. сворачиваете полученную новую ТЗ по этой колонке, выгружаете ее в массив (последнее не обязательно, можно гнать цикл и по таблице из 1 колонки). на этом шаге вы получаете список всех уникальных идентификаторов документов, которые надо обработать.
3. бежите циклом по полученному списку (не важно, в каком виде - ТЗ, или массив), выбираете по НомерДоверенности документ из базы, очищаете таб. часть, далее методом НайтиСтроки выбираете в первоначальной таблице (полученной выше путем обработки экселя) все строки с таким НомерДоверенности, бежите во вложенном цикле по этим строкам, добавляете их в документ, после завершения вложенного цикла записываете док.

как-то так


Теги:
 

заполнение закладки "Материалы" в документе "Поступление из переработки"

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

Ответов: 2
Просмотров: 3589
Последний ответ 10 Июн 2013, 22:34
от Sasa1C
Заполнение табличной части при выборе реквизита другой табличной части в документе.

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

Ответов: 5
Просмотров: 309
Последний ответ 25 Окт 2017, 14:15
от Vlad-93
УТ 11.В документе "Заявка на расходование денежных средств" нет кнопки "Печать"!

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

Ответов: 1
Просмотров: 3755
Последний ответ 29 Июн 2012, 18:37
от LexaK
Как сделать, чтобы поле в документе имело тип "ссылка на поле справочника"?

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

Ответов: 5
Просмотров: 2028
Последний ответ 05 Мар 2017, 14:36
от Igor100500
Не активно поле ПОЛУЧАТЕЛЬ в документе "выдача наличных" и в "кассовых документах"

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

Ответов: 1
Просмотров: 912
Последний ответ 31 Авг 2016, 16:02
от Masik777

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

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

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


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

* Реклама

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

СМОТРЕТЬ >>

* Поиск

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

* Реклама

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

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

Геннадий ОбьГЭС Геннадий ОбьГЭС
166 Сообщений
ilyay ilyay
75 Сообщений
oleg-x
55 Сообщений
alex0402
46 Сообщений
andron81_81
42 Сообщений
AIFrame
36 Сообщений
MuI_I_Ika MuI_I_Ika
31 Сообщений
BuhRust
28 Сообщений
Golickoff Golickoff
28 Сообщений
Dima Dddd Dima Dddd
26 Сообщений

* Кто онлайн

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

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

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

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

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

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal