Имя: Пароль:
 
1C
1С v8
v8: Как дополнить движения документа Операция методом ЗаполнитьЗначенияСвойств?
0 Stella0608
 
27.12.12
18:03
БП 2.0.
Есть внешняя обработка, создающая проводки в документе Операция (бух.)
Делается это так:
1) создается структура, содержащая проводки документа. По реквизитам совпадает с движениями документа. Код могу привести.
2) Далее выполняется такая вот конструкция:
ЗаполнитьЗначенияСвойств(Документ, СтруктураДок);

Если СтруктураДок.Свойство("Движения") = Истина Тогда
   Для Каждого Движение Из СтруктураДок.Движения Цикл
       Документ.Движения[Движение.Имя].Загрузить(Движение.Данные);
   КонецЦикла;
КонецЕсли;

Документ.Записать(РежимЗаписиДокумента.Запись);

В данном случае:
Документ = найденный документ Операция (бух.). Тип - ДокументОбъект.
По умолчанию подразумевается, что документ найден и существует в базе.
При выполнении вышеописанно конструкции проводки документа перезаписываются.
Необходимо, чтобы они дополнялись. Т.е. существующие движения оставались нетронутыми, в то время как движения из структуры дозаписывались.
При этом максимально не страдала производительность.
Как это можно сделать?
P.S. В 8.2 не особо сильна, я больше по 7.7.
1 Stella0608
 
27.12.12
18:04
Дополнения: ошибка в названии темы. Вместо СтруктураДок имелось ввиду ЗаполнитьЗначенияСвойств.
2 zak555
 
27.12.12
18:04
ты лучше заполняй ТЧ, потом пиши, а проводки сами появятся
3 Stella0608
 
27.12.12
18:09
Данный код писала не я, структура была создана с целью оптимизации.
Самое банальное что приходит в голову - дополнить структуру уже имеющимися проводками.
Но есть подозрение, что это долго и есть более простой способ.
4 zak555
 
27.12.12
18:13
РегистрБухгалтерииНаборЗаписей.<Имя регистра бухгалтерии> (AccountingRegisterRecordSet.<Имя регистра бухгалтерии>)
Загрузить (Load)
Синтаксис:
Загрузить(<Таблица значений>)
Параметры:
<Таблица значений> (обязательный)
Тип: ТаблицаЗначений. Таблица значений, содержащая данные для заполнения набора записей.
Описание:
Загружает набор записей значениями из переданной таблицы значений. При этом все прежние записи набора удаляются. Заполняются значения доступных для записи свойств записей регистра бухгалтерии, имена которых совпали c именами колонок таблицы значений.
Для каждого субконто создается пара колонок с идентификаторами вида ВидСубконто<Номер>, Субконто<Номер>, для регистра не поддерживающего корреспонденцию, и ВидСубконтоДт<Номер>, СубконтоДт<Номер>, ВидСубконтоКт<Номер>, СубконтоКт<Номер>, для регистра поддерживающего корреспонденцию. При этом номера <Номер> могут не совпадать с номерами видов субконто на соответствующем счете.
Пример:
Рег = РегистрыБухгалтерии.Хозрасчетный;
НаборЗаписей = Рег.СоздатьНаборЗаписей();
Таб = Новый ТаблицаЗначений;
// формирование таблицы
// ...
НаборЗаписей.Загрузить(Таб);
5 Stella0608
 
27.12.12
18:16
(4) Т.е. предлагаете выгрузить уже существующие записи в ТЗ?
Насколько я помню, у ТЗ тоже нет метода "догрузить" (а так порой не хватает :()
6 zak555
 
27.12.12
18:17
Времянка = Документ.Движения[Движение.Имя].Выгрузить();
//... добволнить Времянка Движение.Данные, а потом
Документ.Движения[Движение.Имя].Загрузить(Времянка);
7 zak555
 
27.12.12
18:17
(5) в 7ке было
8 zak555
 
27.12.12
18:20
(3) оставь структуру, измени алгоритм напонерия
9 Stella0608
 
27.12.12
18:21
(8) Т.е. манипулировать с ТЗ? А догружать как, в цикле?
10 zak555
 
27.12.12
18:23
11 zak555
 
27.12.12
18:25
(9) нет, в БП у дока операция есть табличная часть (ТЧ)
грузить туда данные то структуры, какой есть
как загрузить в ТЧ, записываешь  документ
и сам типовой алгоритм записи документа создаст движения

ведь, если юзер зайдёт в этот док операция и нажмёт записать -- всё пропадёт
12 Stella0608
 
27.12.12
18:29
(11)
Немного непонятно.
То, что я уловила - скрещиваются 2 ТЗ (из документа и новая из структуры) и уже грузятся в готовый док.
Вот как пока для меня непонятно.
Вариант с циклом боюсь будет долгий, временная ТЗ - еще дольше.
Хотя другого варианта пока не вижу...
13 zak555
 
27.12.12
18:29
или у дока операция нет ТЧ, а на форме сами движения ?
не могу посмотреть
14 Stella0608
 
27.12.12
21:56
(13) Скажу честно, этот код писала не я, и додумалась до него тоже не я :).
Но мне было сказано, что он был написан для оптимизации.
Похоже единственный на данный момент способ решения проблемы, которая есть - дополнять ТЗ данными в цикле :(.
Если кто-нибудь подскажет более оптимальный, буду очень благодарна. Пока я его не вижу.
"Описание:
Загружает набор записей значениями из переданной таблицы значений. При этом все прежние записи набора удаляются."
Вот последнее предложение убрать либо сделать параметром и все было бы зашибись :(.
15 kotletka
 
27.12.12
22:08
(13)нет тч есть только движения, они и наполняют
16 kotletka
 
27.12.12
22:15
если попробовать через ЗаполнитьЗначенияСвойств(Документ.движения.Хозрасчетные, СтруктураДок.Движения)
17 kotletka
 
27.12.12
22:20
Записи = Документ.Движения.Хозрасчетный
Если СтруктураДок.Свойство("Движения") = Истина Тогда
   Для Каждого Движение Из СтруктураДок.Движения Цикл
       НоваяЗапись =Записи.Добавить();
       ЗаполнитьЗначенияСвойств(НоваяЗапись,Движение);
   КонецЦикла;
КонецЕсли;
Записи.Записать();
18 Stella0608
 
28.12.12
09:16
Так, можно по порядку?
Что именно делает исходный код?
Я подозреваю, что конструкция
Документ.Движения[Движение.Имя].Загрузить(Движение.Данные);
загружает в документ Операция данные из ТЗ.
А вот зачем нужна конструкция ЗаполнитьЗначенияСвойств(Документ, СтруктураДок);
Она вообще зависит от заполненности ТЗ?
19 cw014
 
28.12.12
09:19
Движения записывай, причем с параметром Заменять = Ложь
20 cw014
 
28.12.12
09:19
А сам документ перезаписывать не надо - это грязные инсинуации
21 zak555
 
28.12.12
09:19
(15) да, я посмотрел уже
22 Stella0608
 
28.12.12
09:20
Как?! :(
Что делает конструкция ЗаполнитьЗначенияСвойств()?!
23 zak555
 
28.12.12
09:21
(17) +1
ЗаполнитьЗначенияСвойств -- для всех типов
24 zak555
 
28.12.12
09:21
(22) добавляет твои двежения из структуры
25 Stella0608
 
28.12.12
09:22
(23) Это очевидно, т.к. она глобальная. Но что именно?
Есть структура.
И в этой структуре есть ТЗ с движениями.
Этот метод эти самые движения пишет из структуры?
Если да, то какой смысл в следующих строчках кода? :(
26 zak555
 
28.12.12
09:24
(25) в (0) ты перезаписывала, а в (17) ты дозаписываешь
27 zak555
 
28.12.12
09:26
Движения = Документ.Движения
Если СтруктураДок.Свойство("Движения") = Истина Тогда

   Для Каждого Движение Из СтруктураДок.Движения Цикл  
       ЗаполнитьЗначенияСвойств(Движения[Движение.Имя].Добавить(),Движение);
   КонецЦикла;
КонецЕсли;
28 zak555
 
28.12.12
09:32
как я понял автору нужна универсальность : или дозаписывать или перезаписывать
29 Stella0608
 
28.12.12
09:32
Исходная задача поставлена так: добавить на форму внешней обработки флаг.
Если ложь - движения перезаписывать, если нет, дозаписывать.
С флагом я сама разберусь, нужно понять исходный код.
30 Stella0608
 
28.12.12
09:32
(28) Опередил :)))
31 zak555
 
28.12.12
09:34
Движения = Документ.Движения
Если СтруктураДок.Свойство("Движения") = Истина Тогда

   Для Каждого Движение Из СтруктураДок.Движения Цикл  
       Если Дощаписывать Тогда
ЗаполнитьЗначенияСвойств(Движения[Движение.Имя].Добавить(),Движение); Иначе
           Движения[Движение.Имя].Загрузить(Движение.Данные);
       КонецЕсли;
   КонецЦикла;
КонецЕсли;
32 zak555
 
28.12.12
09:48
Если СтруктураДок.Свойство("Движения") Тогда
   Движения = Документ.Движения;
   Для Каждого ДвижениеИзСтруктурыДок Из СтруктураДок.Движения Цикл
       ИмяРегистра = ДвижениеИзСтруктурыДок.Имя;
       Если ДозаписатьДвижения Тогда
           ЗаполнитьЗначенияСвойств(Движения[ИмяРегистра].Добавить(), ДвижениеИзСтруктурыДок);
       Иначе
           Движения[ИмяРегистра].Загрузить(Движение.Данные);
       КонецЕсли;
   КонецЦикла;
КонецЕсли;
33 Stella0608
 
28.12.12
09:54
А чем отличаются (31) и (32)?
34 vicof
 
28.12.12
09:56
фотку уже просили?
35 Stella0608
 
28.12.12
10:01
(34) Те кому была нужна уже все нашли :))).
36 CaptanG
 
28.12.12
10:03
(34) помог zak555 ему и просить
37 Stella0608
 
28.12.12
10:08
(36) zak555 сам нашел все что ему нужно :).
И я так и не получила ответа на (33).
38 zak555
 
28.12.12
10:09
(34) сюда OFF: Преимущество фото в личке. не смотрел ?
39 zak555
 
28.12.12
10:38
РегистрБухгалтерииНаборЗаписей.<Имя регистра бухгалтерии>.Загрузить (AccountingRegisterRecordSet.<Имя регистра бухгалтерии>.Load)
РегистрБухгалтерииНаборЗаписей.<Имя регистра бухгалтерии> (AccountingRegisterRecordSet.<Имя регистра бухгалтерии>)
Загрузить (Load)
Синтаксис:

Загрузить(<ТаблицаЗначений>)
Параметры:

<ТаблицаЗначений> (обязательный)

Тип: ТаблицаЗначений.
Таблица значений, содержащая данные для заполнения набора записей.
Описание:

Загружает набор записей значениями из переданной таблицы значений. При этом все прежние записи набора удаляются. Заполняются значения доступных для записи свойств записей регистра бухгалтерии, имена которых совпали c именами колонок таблицы значений.
Для каждого субконто создается пара колонок с идентификаторами вида ВидСубконто<Номер>, Субконто<Номер>, для регистра не поддерживающего корреспонденцию, и ВидСубконтоДт<Номер>, СубконтоДт<Номер>, ВидСубконтоКт<Номер>, СубконтоКт<Номер>, для регистра поддерживающего корреспонденцию. При этом номера <Номер> могут не совпадать с номерами видов субконто на соответствующем счете.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Пример:

Рег = РегистрыБухгалтерии.Хозрасчетный;
НаборЗаписей = Рег.СоздатьНаборЗаписей();
Таб = Новый ТаблицаЗначений;
// формирование таблицы
// ...
НаборЗаписей.Загрузить(Таб);
40 Stella0608
 
28.12.12
10:57
Я конечно безнадежна, но синтаксис помошник читать умею. :)
Вопрос в другом:
Методы
ЗаполнитьЗначенияСвойств
и
Загрузить()
- не взаимозаменяемы ли они? Если нет, то что именно делает первым? Прошу объяснить доступным языком для блондинок :).
Ну туплю я сегодня, голова болит, у всех бывает :(.
41 zak555
 
28.12.12
11:00
(40) загрузить всё заместит, а вот строка
ЗаполнитьЗначенияСвойств(Движения[ИмяРегистра].Добавить(), ДвижениеИзСтруктурыДок);

делает следующее:

НовоеДвижение = Движения[ИмяРегистра].Добавить();

ЗаполнитьЗначенияСвойств(НовоеДвижение, ДвижениеИзСтруктурыДок);
42 zak555
 
28.12.12
11:00
Глобальный контекст.ЗаполнитьЗначенияСвойств (Global context.FillPropertyValues)
Глобальный контекст (Global context)
ЗаполнитьЗначенияСвойств (FillPropertyValues)
Синтаксис:

ЗаполнитьЗначенияСвойств(<Приемник>, <Источник>, <СписокСвойств>, <ИсключаяСвойства>)
Параметры:

<Приемник> (обязательный)

Тип: Произвольный.
Значение, чьи свойства будут заполнены значениями соответствующих свойств <Источника>.
<Источник> (обязательный)

Тип: Произвольный.
Значения свойств данного объекта будут установлены в соответствующие свойства <Приемника>.
<СписокСвойств> (необязательный)

Тип: Строка.
Список имен свойств, разделенный запятыми, которые необходимо заполнить.
Если свойства не указаны, то копируются только те, которые представлены и в <Источнике> и в <Приемнике>.
Если свойства указаны, то они обязательно должны присутствовать в обоих объектах.
Если в <Источнике> или <Приемнике> заданное свойство отсутствует, то будет вызвано исключение.
<ИсключаяСвойства> (необязательный)

Тип: Строка.
Список имен свойств, разделенный запятыми, которые необходимо исключить из заполнения.
Описание:

Копирует значения свойств <Источника> в свойства <Приемника>. Сопоставление производится по именам свойств.
Если указаны копируемые свойства, то в заполнении участвуют только они, параметр <ИсключаяСвойства> игнорируется.
В противном случае, если указан параметр <ИсключаяСвойства>, то свойства перечисленные в нем, исключаются из обработки.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
43 zak555
 
28.12.12
11:01
в ДвижениеИзСтруктурыДок -- это как бы одна "строка"
т.е. эту строку "копируем" в НовоеДвижение
44 Stella0608
 
28.12.12
11:05
Немного непонятна вот эта строка.
ЗаполнитьЗначенияСвойств(НовоеДвижение, ДвижениеИзСтруктурыДок);
Она проводки что ли не заполняет? Если нет, то что она вообще делает? :)
45 sidalexsandr
 
28.12.12
11:07
Глобальный контекст (Global context)
ЗаполнитьЗначенияСвойств (FillPropertyValues)
Синтаксис:

ЗаполнитьЗначенияСвойств(<Приемник>, <Источник>, <СписокСвойств>, <ИсключаяСвойства>)
Параметры:

<Приемник> (обязательный)

Тип: Произвольный.
Значение, чьи свойства будут заполнены значениями соответствующих свойств <Источника>.
<Источник> (обязательный)

Тип: Произвольный.
Значения свойств данного объекта будут установлены в соответствующие свойства <Приемника>.
<СписокСвойств> (необязательный)

Тип: Строка.
Список имен свойств, разделенный запятыми, которые необходимо заполнить.
Если свойства не указаны, то копируются только те, которые представлены и в <Источнике> и в <Приемнике>.
Если свойства указаны, то они обязательно должны присутствовать в обоих объектах.
Если в <Источнике> или <Приемнике> заданное свойство отсутствует, то будет вызвано исключение.
<ИсключаяСвойства> (необязательный)

Тип: Строка.
Список имен свойств, разделенный запятыми, которые необходимо исключить из заполнения.
Описание:

Копирует значения свойств <Источника> в свойства <Приемника>. Сопоставление производится по именам свойств.
Если указаны копируемые свойства, то в заполнении участвуют только они, параметр <ИсключаяСвойства> игнорируется.
В противном случае, если указан параметр <ИсключаяСвойства>, то свойства перечисленные в нем, исключаются из обработки.

Доступность:

Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
46 zak555
 
28.12.12
11:08
(45) что у тебя за старый сп ?
47 sidalexsandr
 
28.12.12
11:09
(46) Синтаксис - помощник в пофигураторе.
48 Stella0608
 
28.12.12
11:09
(46) Объясните для блондинок плиииз! :)
49 zak555
 
28.12.12
11:09
(47) сравни своё и (42)
50 Stella0608
 
28.12.12
11:12
Меня на данный момент интересует что именно делает эта строка:
ЗаполнитьЗначенияСвойств(Документ, СтруктураДок);
Что делает этот метод я примерно представляю.
Вопрос в том, что он делает в данном конкретном случае!
51 Stella0608
 
28.12.12
11:12
И да, у меня есть СП :)
52 aka AMIGO
 
28.12.12
11:15
я пытаюсь обычно, как попроще.. в результате получается мой личный г-код :)

   //готовим регистры для записи
   РегХозрасчетный = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
   РегХозрасчетный.Отбор.Регистратор.Значение = ДокОперацияСсылка;
   РегХозрасчетный.Очистить(); //мне надо стереть старые проводки
   РегХозрасчетный.Записать(Истина); //стер! ура.. :)

//а далее - надо записать мои личные проводки:

                   РегЗапись = РегХозрасчетный.Добавить(); //ЭЛ
                   РегЗапись.Период = ДатаДокумента;
                   РегЗапись.Регистратор = ДокОперацияСсылка;
                   РегЗапись.Организация = ВыбОрганизация;
                   РегЗапись.СчетДт = СчетЭЛ;
                   БухгалтерскийУчет.УстановитьСубконто(РегЗапись.СчетДт, РегЗапись.СубконтоДт, "Контрагенты", Стр.Контр);
                   БухгалтерскийУчет.УстановитьСубконто(РегЗапись.СчетДт, РегЗапись.СубконтоДт, "Номенклатура", СПН.НайтиПоНаименованию("эл.энергия день"));
                   РегЗапись.КоличествоДт = Коплате;
                   РегЗапись.Сумма = Сум;

//и, наконец, победная точка:

   Если ЕстьЧтоЗаписать=1 Тогда
       РегХозрасчетный.Записать(Истина);
       ДокОперация.СуммаОперации = СуммаДокумента;
       ДокОперация.Записать();


//вроде проще уж и некуда..
53 zippygrill
 
28.12.12
11:26
и почему фото никто не попросил? :)
54 zak555
 
28.12.12
11:27
(53) см. в (38)
55 CaptanG
 
28.12.12
11:28
(53) потому что те кто помогает уже видели а остальные обойдуться
56 Stella0608
 
28.12.12
13:29
У меня счета Дт, Кт и субконто хранятся в ТЗ.
Общая организация обработки такая (цель - импорт данных из txt файла):
1) делается цикл собственно по txt файлу.
2) создается структура идентичная документу ОперацияБух
3) в цикле по файлу пытаемся создать нужных контрагентов, товаров и т.п.. Попутно в структуру в элемент Движения, тип у которого - ТЗ, пихаем сами проводки.
4) если возник сбой на этапе загрузки, обработка ничего не делает и пишет "ошибка".
5) если все отработало нормально, делается цикл по структуре и уже оттуда записываются уже готовые сформированные проводки в документ Операция.
В данном случае идет их перезапись.
57 zak555
 
28.12.12
14:39
ЗаполнитьЗначенияСвойств(Документ, СтруктураДок); // заполняет шапку этот код

//перезаписываем или дополняем движения

   

Если СтруктураДок.Свойство("Движения") Тогда
   Движения = Документ.Движения;
   Для Каждого ДвижениеИзСтруктурыДок Из СтруктураДок.Движения Цикл
       ИмяРегистра = ДвижениеИзСтруктурыДок.Имя;
       Если ДозаписатьДвижения Тогда
           ЗаполнитьЗначенияСвойств(Движения[ИмяРегистра].Добавить(), ДвижениеИзСтруктурыДок);
       Иначе
           Движения[ИмяРегистра].Загрузить(Движение.Данные);
       КонецЕсли;
   КонецЦикла;
КонецЕсли;
58 Stella0608
 
28.12.12
14:56
(57) Понятно все кроме вот этой строки (привожу свой код):
ЗаполнитьЗначенияСвойств(Документ, СтруктураДок);
Вот ее куда?
59 Stella0608
 
28.12.12
14:56
Просто вот именно эта строка мне и непонятна. Остальное все более менее...
60 zak555
 
28.12.12
14:57
(59) она заполняет все реквизиты документа операцияБух
61 Stella0608
 
28.12.12
14:58
(60) А проводки?
62 Stella0608
 
28.12.12
17:54
(57) не работает.
Выдает ошибку, что счета не заполнены.
63 zak555
 
28.12.12
18:08
заменить строку


для Каждого ДвижениеИзСтруктурыДок Из СтруктураДок.Движения Цикл

на

для Каждого ДвижениеИзСтруктурыДок Из СтруктураДок.Движения.Данные Цикл
64 Stella0608
 
28.12.12
18:22
(63) Аналогичная ошибка.
{ВнешняяОбработка.ОбщМодульФУТД.МодульОбъекта(57)}: Ошибка при вызове метода контекста (Записать): Запись не верна! Не заполнены оба счета! (Регистр бухгалтерии: Журнал проводок (бухгалтерский и налоговый учет); Номер строки: 1)
65 zak555
 
28.12.12
18:27
а так ?

ЗаполнитьЗначенияСвойств(Документ, СтруктураДок);

Если СтруктураДок.Свойство("Движения") Тогда
   Движения = Документ.Движения;
   Для Каждого ДвижениеИзСтруктурыДок1 Из СтруктураДок.Движения Цикл
     Для Каждого ДвижениеИзСтруктурыДок Из ДвижениеИзСтруктурыДок1 Цикл
       ИмяРегистра = ДвижениеИзСтруктурыДок.Имя;
       Если ДозаписатьДвижения Тогда
           ЗаполнитьЗначенияСвойств(Движения[ИмяРегистра].Добавить(), ДвижениеИзСтруктурыДок);
       Иначе
           Движения[ИмяРегистра].Загрузить(Движение.Данные);
       КонецЕсли;
     КонецЕсли;
   КонецЦикла;
КонецЕсли;

Документ.Записать(РежимЗаписиДокумента.Запись);
66 zak555
 
28.12.12
18:35
ЗаполнитьЗначенияСвойств(Документ, СтруктураДок);

Если СтруктураДок.Свойство("Движения") Тогда
   Для Каждого Движение Из СтруктураДок.Движения Цикл
       Если ДозаписатьДвижения Тогда
           Для Каждого ДвижениеТЗ Из Движение.Данные Цикл
               ЗаполнитьЗначенияСвойств(Движения[Движение.Имя].Добавить(), ДвижениеТЗ);
           КонецЦикла;
       Иначе
           Документ.Движения[Движение.Имя].Загрузить(Движение.Данные);
       КонецЕсли;
   КонецЦикла;
КонецЕсли;

Документ.Записать(РежимЗаписиДокумента.Запись);
67 zak555
 
28.12.12
18:35
с тебя стрипШоу !
68 Stella0608
 
28.12.12
18:54
{ВнешняяОбработка.ОбщМодульФУТД.МодульОбъекта(36,44)}: Переменная не определена (Движения)
                       ЗаполнитьЗначенияСвойств(<<?>>Движения[Движение.Имя].Добавить(), ДвижениеТЗ); (Проверка: Толстый клиент (обычное приложение))

Не будет тебе стриптизу :))).
69 Stella0608
 
28.12.12
19:12
Ощущение, что обработка, натыкаясь на уже найденный док, не видит его движения...
70 Stella0608
 
28.12.12
19:15
Метод
Документ.Движения.Хозрасчетный
возвращает тип данных
РегистрБухгалтерииНаборЗаписей.Хозрасчетный
а как мне подобраться к проводкам уже найденного документа?
71 Stella0608
 
28.12.12
19:19
Точку останова ставлю на моменте поиска документа по номеру.
72 Stella0608
 
28.12.12
21:48
Столкнулась с таким моментом.
Набор записей надо было прочитать, иначе он банально перезаписывался даже с использованием метода добавить.
Но! это не сильно помогло, т.к. регистратор и активность принудительно проставлялись только после записи документа, и при попытке дозаписи проводок документ ругался "запись не активна".
Сделала через времянку как советовали в самом начале темы, т.к. "надо было сделать еще вчера".
Если кто-то подскажет более красивое решение, буду благодарна.