Имя: Пароль:
1C
1С v8
Ввод остатков по партиям
0 Novi4ek2015
 
06.04.15
14:16
Добрый день!
Есть запрос который выбирает остатки по партиям. На основании него надо создать документ ввод остатков: и документ оприходования=партия в документе ввода остатков.Запрос работает хорошо,проверенно, но вот в цикле когда перебираю товары, то зацикливается создание документа ввода остатков.Помогите в чем проблема?
Для Каждого УзелОрганизация из ДЗОстатки.Строки цикл
        ДокументВводаОстатков.Организация= УзелОрганизация.Организация;
        ДокументВводаОстатков.РазделУчета= Перечисления.РазделыУчетаДляВводаОстатков.Товары;
                
        сч = 0;
        для Каждого УзелДокументОприходования из УзелОрганизация.Строки цикл
            сч = сч + 1;
            НоваяСтрокаТЧ = ДокументВводаОстатков.МПЗПриобретенные.Добавить();
            НоваяСтрокаТЧ.НомерСтрокиТЧ        = сч;
            НоваяСтрокаТЧ.Номенклатура        = УзелДокументОприходования.Номенклатура;
            НоваяСтрокаТЧ.Партия            = УзелДокументОприходования.ДокументОприходования;
            НоваяСтрокаТЧ.РасчетныйДокумент = УзелДокументОприходования.ДокументОприходования;
            НоваяСтрокаТЧ.СтатусыОплатыРасходовУСН = Перечисления.СтатусыРасходовУСН.НеСписано;
            НоваяСтрокаТЧ.ОтражениеВУСН        = Перечисления.ОтражениеВУСН.Принимаются;
            НоваяСтрокаТЧ.Валюта            = Константы.ВалютаРегламентированногоУчета.Получить();
            НоваяСтрокаТЧ.Склад                = УзелДокументОприходования.Склад;
            
                    
            НоваяСтрокаТЧ.Оплачен            = истина;
            НоваяСтрокаТЧ.Количество        = УзелДокументОприходования.Количество;
            НоваяСтрокаТЧ.Сумма            = УзелДокументОприходования.Стоимость;
            НоваяСтрокаТЧ.СуммаНУ            = УзелДокументОприходования.Стоимость;
            НоваяСтрокаТЧ.ВалютнаяСумма        = УзелДокументОприходования.Стоимость;
        КонецЦикла;
                
        ДокументВводаОстатков.ПолучитьФорму().Открыть();
    КонецЦикла;
1 vicof
 
06.04.15
14:18
ну тут много думать не надо, по-моему
2 vicof
 
06.04.15
14:18
что же нужно вынести из цикла?
3 Славен
 
06.04.15
14:19
а где ДокументВводаОстатков.создатьДокумент()?
4 vicof
 
06.04.15
14:19
(3) Это уже следующий вопрос
5 Novi4ek2015
 
06.04.15
14:20
ДокументВводаОстатков = Документы.ВводНачальныхОстатков.СоздатьДокумент();
        ДокументВводаОстатков.Дата= ДатаВводаОстатков;
        ДокументВводаОстатков.Организация= УзелОрганизация.Организация;
6 Novi4ek2015
 
06.04.15
14:20
Есть, просто случайно не скопировал
7 Novi4ek2015
 
06.04.15
14:22
Я не знаю в чем проблема, все пробовал
8 vicof
 
06.04.15
14:24
ну если форма открывается 25 раз, наверное, нужно ее открытие (7) за цикл вынести, не?
9 Славен
 
06.04.15
14:30
(8) у него создается несколько документов, и соответственно несколько форм
10 Novi4ek2015
 
06.04.15
14:31
у меня должно создаться несколько документов,сколько организаций,столько и документов.А если вынести за цикл, то создается пустой документ, только шапка заполнена
11 Славен
 
06.04.15
14:31
(5) у тебя этот код где? после Для Каждого УзелОрганизация из ДЗОстатки.Строки цикл ?
12 Novi4ek2015
 
06.04.15
14:32
Что то ни так в этом цикле:
           сч = 0;
        для Каждого УзелДокументОприходования из УзелОрганизация.Строки цикл
            сч = сч + 1;
            НоваяСтрокаТЧ = ДокументВводаОстатков.МПЗПриобретенные.Добавить();
            НоваяСтрокаТЧ.НомерСтрокиТЧ    = сч;
            НоваяСтрокаТЧ.Номенклатура    = УзелДокументОприходования.Номенклатура;
            НоваяСтрокаТЧ.Партия        = УзелДокументОприходования.ДокументОприходования;
            НоваяСтрокаТЧ.РасчетныйДокумент = УзелДокументОприходования.ДокументОприходования;
            НоваяСтрокаТЧ.СтатусыОплатыРасходовУСН = Перечисления.СтатусыРасходовУСН.НеСписано;
            НоваяСтрокаТЧ.ОтражениеВУСН    = Перечисления.ОтражениеВУСН.Принимаются;
            НоваяСтрокаТЧ.Валюта        = Константы.ВалютаРегламентированногоУчета.Получить();
            НоваяСтрокаТЧ.Склад        = УзелДокументОприходования.Склад;
                    
            
            НоваяСтрокаТЧ.Оплачен            = истина;
            НоваяСтрокаТЧ.Количество        = УзелДокументОприходования.Количество;
            НоваяСтрокаТЧ.Сумма                = УзелДокументОприходования.Стоимость;
            НоваяСтрокаТЧ.СуммаНУ            = УзелДокументОприходования.Стоимость;
            НоваяСтрокаТЧ.ВалютнаяСумма        = УзелДокументОприходования.Стоимость;
        КонецЦикла;
13 Славен
 
06.04.15
14:34
(12) все норм
14 Novi4ek2015
 
06.04.15
14:35
Но почему то не работает(
15 Славен
 
06.04.15
14:35
на (11)ответь
16 Славен
 
06.04.15
14:36
и вообще покажи код от запроса до конца
17 Novi4ek2015
 
06.04.15
14:37
Этот код внутри цикла УзелОрганизация из ДЗОстатки.Строки.
18 Славен
 
06.04.15
14:38
(17) весь код из 0 вызываешь в рекурсии?
19 Novi4ek2015
 
06.04.15
14:39
нет,это отдельный код
20 Славен
 
06.04.15
14:39
(17) тогда цикл нормальный, и первый и второй вложенный
21 Славен
 
06.04.15
14:40
ищи ошибку в другом месте
22 Novi4ek2015
 
06.04.15
14:45
для каждого ВнешУзелОрганизация из ВнешДЗЗапрос.Строки цикл
        УзелОрганизация = ДЗОстатки.Строки.Добавить();
        УзелОрганизация.Организация = ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелОрганизация.Организация));
        
для каждого ВнешУзелДокументОприходования из ВнешУзелОрганизация.строки цикл
    УзелДокументОприходования = УзелОрганизация.Строки.Добавить();
    УзелДокументОприходования.Организация    =ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелДокументОприходования.Организация));
    УзелДокументОприходования.Склад = ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелДокументОприходования.Склад));
    УзелДокументОприходования.ДокументОприходования    =ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелДокументОприходования.ДокументОприходования));
    УзелДокументОприходования.Номенклатура    = ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелДокументОприходования.Номенклатура));
    УзелДокументОприходования.Количество    = ВнешУзелДокументОприходования.Количество;
    УзелДокументОприходования.Стоимость= ВнешУзелДокументОприходования.Стоимость;
КонецЦикла;
КонецЦикла;
23 Novi4ek2015
 
06.04.15
14:45
Это первый цикл.Потом идет что я первый раз выкладывал
24 Славен
 
06.04.15
14:51
(23) а как твоя процедура/функция называется?
25 Славен
 
06.04.15
14:51
не ПолучитьСоответствиеПоКлючу случайно?
26 Novi4ek2015
 
06.04.15
14:54
ПолучитьСоответствиеПоКлючу
27 Славен
 
06.04.15
14:55
(26) вот батенька не в цикле дело а в том что ты бесконечную рекурсию написал, без выхода из нее. Ты вызываешь из процедуры эту же процедуру и у тебя постоянно повторяется условие при котором вызов продолжается, т.е. никогда не срабатывает выход из неё
28 Novi4ek2015
 
06.04.15
14:59
Спасибо,попробую исправить
29 Novi4ek2015
 
06.04.15
16:37
я уже не знаю,что делать((Помогите с этим запросом:
ВнешЗапрос.Текст = "
        |ВЫБРАТЬ
        |    ТоварыОрганизацийОстатки.Организация КАК Организация,
        |    ТоварыОрганизацийОстатки.Номенклатура КАК Номенклатура,
        |    ТоварыОрганизацийОстатки.Склад КАК Склад,
        |    ПартииТоваровНаСкладахОстатки.ДокументОприходования КАК Партия,
        |    ПартииТоваровНаСкладахОстатки.СтоимостьОстаток КАК Стоимость,
        |    ПартииТоваровНаСкладахОстатки.КоличествоОстаток КАК Количество
        |ИЗ
        |    РегистрНакопления.ПартииТоваровНаСкладах.Остатки(&ДатаОстатков, ) КАК ПартииТоваровНаСкладахОстатки
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыОрганизаций.Остатки(&ДатаОстатков, ) КАК ТоварыОрганизацийОстатки
        |        ПО ПартииТоваровНаСкладахОстатки.Номенклатура = ТоварыОрганизацийОстатки.Номенклатура
        |            И ПартииТоваровНаСкладахОстатки.Склад = ТоварыОрганизацийОстатки.Склад
        |ГДЕ
        |    ПартииТоваровНаСкладахОстатки.КоличествоОстаток > 0
        |
        |СГРУППИРОВАТЬ ПО
        |    ТоварыОрганизацийОстатки.Организация,
        |    ТоварыОрганизацийОстатки.Склад,
        |    ПартииТоваровНаСкладахОстатки.ДокументОприходования,
        |    ТоварыОрганизацийОстатки.Номенклатура,
        |    ПартииТоваровНаСкладахОстатки.СтоимостьОстаток,
        |    ПартииТоваровНаСкладахОстатки.КоличествоОстаток
        |
        |Итоги ПО
        |    Организация";

        
    Состояние("Выполняется внешний запрос...");
    ВнешДЗЗапрос = ВнешЗапрос.выполнить().Выгрузить(Подключение.ОбходРезультатаЗапроса.ПоГруппировкам);
    
    ДЗОстатки = Новый ДеревоЗначений;
    ДЗОстатки.Колонки.Добавить("Организация");
    ДЗОстатки.Колонки.Добавить("Склад");
    ДЗОстатки.Колонки.Добавить("Партия");    
    ДЗОстатки.Колонки.Добавить("Номенклатура");
    ДЗОстатки.Колонки.Добавить("Количество");
    ДЗОстатки.Колонки.Добавить("Стоимость");
    
    Состояние("Поиск соответствий...");
    для каждого ВнешУзелОрганизация из ВнешДЗЗапрос.Строки цикл
        УзелОрганизация = ДЗОстатки.Строки.Добавить();
        УзелОрганизация.Организация = ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелОрганизация.Организация));
                
        для Каждого ВнешУзелПартия из ВнешУзелОрганизация.строки цикл
            УзелПартия = УзелОрганизация.Строки.Добавить();
            УзелПартия.Организация     = ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелПартия.Организация));
            УзелПартия.Склад         = ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелПартия.Склад));
            УзелПартия.Партия         = ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелПартия.Партия));
            УзелПартия.Номенклатура    = ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелПартия.Номенклатура));
            УзелПартия.Количество    = ВнешУзелПартия.Количество;
            УзелПартия.Стоимость        = ВнешУзелПартия.Стоимость;
        КонецЦикла;        
    КонецЦикла;
    
        
    Для Каждого УзелОрганизация из ДЗОстатки.Строки цикл
        ДокументВводаОстатков = Документы.ВводНачальныхОстатков.СоздатьДокумент();
        ДокументВводаОстатков.Дата= ДатаВводаОстатков;
        ДокументВводаОстатков.Организация= УзелОрганизация.Организация;
        ДокументВводаОстатков.РазделУчета= Перечисления.РазделыУчетаДляВводаОстатков.Товары;
                
        сч = 0;
        для Каждого УзелПартия из УзелОрганизация.Строки цикл
            сч = сч + 1;
            НоваяСтрокаТЧ = ДокументВводаОстатков.МПЗПриобретенные.Добавить();
            НоваяСтрокаТЧ.НомерСтрокиТЧ        = сч;
            НоваяСтрокаТЧ.Номенклатура        = УзелПартия.Номенклатура;
            НоваяСтрокаТЧ.Партия            = УзелПартия.Партия;
            НоваяСтрокаТЧ.РасчетныйДокумент = УзелПартия.Партия;
            НоваяСтрокаТЧ.СтатусыОплатыРасходовУСН = Перечисления.СтатусыРасходовУСН.НеСписано;
            НоваяСтрокаТЧ.ОтражениеВУСН        = Перечисления.ОтражениеВУСН.Принимаются;
            НоваяСтрокаТЧ.Валюта            = Константы.ВалютаРегламентированногоУчета.Получить();
            НоваяСтрокаТЧ.Склад                = УзелПартия.Склад;
                        
            НоваяСтрокаТЧ.Оплачен            = истина;
            НоваяСтрокаТЧ.Количество        = УзелПартия.Количество;
            НоваяСтрокаТЧ.Сумма                = УзелПартия.Стоимость;
            НоваяСтрокаТЧ.СуммаНУ            = УзелПартия.Стоимость;
            НоваяСтрокаТЧ.ВалютнаяСумма        = УзелПартия.Стоимость;
        КонецЦикла;
        
        ДокументВводаОстатков.ПолучитьФорму().Открыть();
    КонецЦикла;
30 Novi4ek2015
 
06.04.15
16:38
Запрос работает правильно, создается документ ввод остатков, шапка документа заполняется,но сам документ или пустой или один товар заполняет.
31 Славен
 
06.04.15
16:39
(30) весь текст процедуры приведи
32 Novi4ek2015
 
06.04.15
16:40
Я привел
33 Славен
 
06.04.15
16:42
вот это

    ДЗОстатки = Новый ДеревоЗначений;
    ДЗОстатки.Колонки.Добавить("Организация");
    ДЗОстатки.Колонки.Добавить("Склад");
    ДЗОстатки.Колонки.Добавить("Партия");    
    ДЗОстатки.Колонки.Добавить("Номенклатура");
    ДЗОстатки.Колонки.Добавить("Количество");
    ДЗОстатки.Колонки.Добавить("Стоимость");
    
    Состояние("Поиск соответствий...");
    для каждого ВнешУзелОрганизация из ВнешДЗЗапрос.Строки цикл
        УзелОрганизация = ДЗОстатки.Строки.Добавить();
        УзелОрганизация.Организация = ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелОрганизация.Организация));
                
        для Каждого ВнешУзелПартия из ВнешУзелОрганизация.строки цикл
            УзелПартия = УзелОрганизация.Строки.Добавить();
            УзелПартия.Организация     = ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелПартия.Организация));
            УзелПартия.Склад         = ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелПартия.Склад));
            УзелПартия.Партия         = ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелПартия.Партия));
            УзелПартия.Номенклатура    = ПолучитьСоответствиеПоКлючу(УзелДляСоответствий,Подключение.ЗначениеВСТрокуВнутр(ВнешУзелПартия.Номенклатура));
            УзелПартия.Количество    = ВнешУзелПартия.Количество;
            УзелПартия.Стоимость        = ВнешУзелПартия.Стоимость;
        КонецЦикла;        
    КонецЦикла;

Убирай нафиг
34 Славен
 
06.04.15
16:45
В запросе сделай Сгруппировать по Организация

ВнешДЗЗапрос = ВнешЗапрос.выполнить().Выгрузить(Подключение.ОбходРезультатаЗапроса.ПоГруппировкам);

пока ВнешДЗЗапрос.Следующий() Цикл
ДокументВводаОстатков = Документы.ВводНачальныхОстатков.СоздатьДокумент();
        ДокументВводаОстатков.Дата= ДатаВводаОстатков;
        ДокументВводаОстатков.Организация= Выборка.Организация;
        ДокументВводаОстатков.РазделУчета= Перечисления.РазделыУчетаДляВводаОстатков.Товары;

Выборка = ВнешДЗЗапрос.Выбрать()
Пока Выборка.Следующий() цикл
НоваяСтрокаТЧ = ДокументВводаОстатков.МПЗПриобретенные.Добавить();
            НоваяСтрокаТЧ.НомерСтрокиТЧ        = сч;
            НоваяСтрокаТЧ.Номенклатура        = Выборка.Номенклатура;
            НоваяСтрокаТЧ.Партия            = Выборка.Партия;
            НоваяСтрокаТЧ.РасчетныйДокумент = Выборка.Партия;
.... и т.д.
КонецЦикла

КонецЦикла
35 Славен
 
06.04.15
16:46
все, никаких рекурсий. все есть в выборке
36 Novi4ek2015
 
06.04.15
16:47
Вот сейчас по коду который я сбросил,создается документ ввод остатков и заполняется весь.Но теперь только не заполняется документ оприходования.
37 Славен
 
06.04.15
16:48
+(34) про сгруппировать по организация -ненадо, я погорячился, все остальное в силе
38 Славен
 
06.04.15
16:49
вот нафига ты сначала дерево строишь по данным запроса, а потом тут же документ заполняешь из этого дерева, если дерево ты строишь по данным запроса то почему сразу не создать и не заполнить по запросу документ
39 Славен
 
06.04.15
16:50
ааа ты же ком подключение вояешь, хотя и по нему можно без дерева
40 Novi4ek2015
 
06.04.15
16:52
Да я уже и так пробовал и так.Сейчас хотя бы все заполняется,кроме документа партии, а это очень важно
41 KLOUN1091
 
06.04.15
20:57
(40) Получилось заполнить документ партии?Подскажите как?
У меня такая же проблема, только задача конечно по проще))
42 Славен
 
07.04.15
09:42
А тебе разве не новый документ партии надо создавать, с типом Партия (ручной учет) (в конфигураторе Партия)  старые то документы не должны переноситься, или ты их переносишь не проведенными?
43 Novi4ek2015
 
07.04.15
10:46
(42) Надо, но не получается.В цикле прописываю:
НоваяСтрокаТЧ.Партия= Документы.Партия.СоздатьДокумент()
Ничего не создается(((
44 Novi4ek2015
 
07.04.15
10:46
(41) Как получится,напишу)
45 Славен
 
07.04.15
11:31
(43) А ты его потом записываешь?
46 Славен
 
07.04.15
11:32
И не НоваяСтрокаТЧ.Партия= Документы.Партия.СоздатьДокумент()

А ДокПартии = Документы.Партия.СоздатьДокумент();
ДокПартии. .... заполняешь реквизитами контрагента и договора

ДокПартии.Записать();
НоваяСтрокаТЧ.Партия = ДокПартии.ссылка;
47 Novi4ek2015
 
07.04.15
12:02
ДокПартии = Документы.Партия.СоздатьДокумент();
ДокПартии.Организация = УзелПартия.Организация;
ДокПартии.Контрагент= УзелПартия.Контрагент;
ДокПартии.ДоговорКонтрагента = УзелПартия.ДоговорКонтрагента;
            
ДокПартии.Записать();
НоваяСтрокаТЧ.Партия = ДокПартии.ссылка

Не работает, не видит данные документа Оприходования.
48 Славен
 
07.04.15
13:34
А где здесь оприходование?
49 Novi4ek2015
 
07.04.15
13:45
ДокПартии = Документы.Партия.СоздатьДокумент();
ДокПартии.Организация =  УзелДокументОприходования.ПартииТоваровНаСкладахОстатки.ДокументОприходования.Организация;
ДокПартии.Дата= УзелДокументОприходования.ПартииТоваровНаСкладахОстатки.ДокументОприходования.Дата;
ДокПартии.Контрагент= УзелДокументОприходования.ПартииТоваровНаСкладахОстатки.ДокументОприходования.Контрагент;
ДокПартии.ДоговорКонтрагента = УзелДокументОприходования.ПартииТоваровНаСкладахОстатки.ДокументОприходования.ДоговорКонтрагента;
ДокПартии.Записать();
НоваяСтрокаТЧ.Партия = ДокПартии.ссылка;
50 Novi4ek2015
 
07.04.15
13:47
Точнее:
ДокПартии = Документы.Партия.СоздатьДокумент();
            ДокПартии.Организация =  УзелДокументОприходования.ДокументОприходования.Организация;
            ДокПартии.Дата= УзелДокументОприходования.ДокументОприходования.Дата;
            ДокПартии.Контрагент= УзелДокументОприходования.ДокументОприходования.Контрагент;
            ДокПартии.ДоговорКонтрагента = УзелДокументОприходования.ДокументОприходования.ДоговорКонтрагента;
            ДокПартии.Записать();
            НоваяСтрокаТЧ.Партия = ДокПартии.ссылка;
51 Novi4ek2015
 
07.04.15
13:47
Но все равно не работает.
52 Славен
 
07.04.15
13:52
отладчик что показывает на этих строках? Какие типы, какие значения
53 Novi4ek2015
 
07.04.15
14:04
(52) Выдает ошибку:
Поле объекта не обнаружено (Контрагент),(Дата).
Если указать только одну строчку:
ДокПартии.Дата= ТекущаДата();
То создает для каждой номенклатуры документ партия с одной и той же датой.
54 Славен
 
07.04.15
15:09
(53) а тебе при вводе остатков не похер какая дата в документе партии (главное до ввода остатков)? Но для каждой номенклатуры свой документ партии это конечно сурово, если у тебя конечно номенклатура не по 1 шт приходит
55 Славен
 
07.04.15
15:10
(53) а УзелДокументОприходования.ДокументОприходования что выводит в отладчике?
56 Novi4ek2015
 
07.04.15
15:14
(54) При списании товара, не правильно будет списываться себестоимость,если они все через один документ, или через разные, но дата одинаковая. Списывается по ФИФО, а если они по одному времени то берется среднее автоматически, а мне надо по партиям, вот и мучаюсь.
Через УзелДокументОприходования.ДокументОприходования  не работает. Работает теперь как было:
ДокПартии = Документы.Партия.СоздатьДокумент();
ДокПартии.Организация =  ВнешУзелПартия.Организация;
ДокПартии.Дата= ТекущаяДата();
//ДокПартии.Контрагент= УзелПартия.Партия.Контрагент;
// ДокПартии.ДоговорКонтрагента = УзелПартия.Партия.ДоговорКонтрагента;
            ДокПартии.Записать();
            НоваяСтрокаТЧ.Партия = ДокПартии.ссылка;