Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Остатки товаров (в док. ПеремещениеТоваров)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
nazarenko
Написал программку по выводу остатков в документ "ПеремещениеТоваров".
Не всегда показывает правильные остатки (в некоторых строчках не правильные).
Медлено открывается документ.


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

        Для Каждого ОформлениеСтроки из ОформленияСтрок Цикл
            строкаТЗ = тз.Найти(Новый Структура("Номенклатура", ОформлениеСтроки.ДанныеСтроки.Номенклатура));
            строкаТЗ = тз.Найти(ОформлениеСтроки.ДанныеСтроки.Номенклатура, "Номенклатура");
            Если строкаТЗ = Неопределено Тогда
                зн1 = "";
            Иначе
                зн1 = строкаТЗ.ОстатокНаВыбраномСкладе;
            КонецЕсли;
            если ЭтотОбъект.Проведен тогда
      зн1 = зн1 - ОформлениеСтроки.ДанныеСтроки.Количество;
            КонецЕсли;
                
            ОформлениеСтроки.Ячейки.ОстатокТовара.Значение = зн1;    // остаток текущего склада
        КонецЦикла;    
КонецПроцедуры


Спасибо за ответы.


 ! 

Правила, п.3
 
Ardi
Цитата(nazarenko @ 01.09.13, 15:11) необходимо зарегистрироваться для просмотра ссылки
Медлено открывается документ.

Надо так:
|ИЗ
        |    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &ВыбСклад, Номенклатура В(&спНоменклатура), ХарактеристикаНоменклатуры В(&спХарактеристикаНоменклатуры)) КАК ТоварыНаСкладахОстатки


Если ведётся учет по характеристикам - то код неправильный.
Если указывается склад в табличной части - код неправильный.
А что показывает правильный остаток? Может в том месте остаток с учетом резервов?
Vofka
Запомните, что всегда стоит использовать параметры виртуальной таблицы, если это возможно. Т.е. в вашем случае условие из ГДЕ надо перенести туда, где у вас условие по складу находится (с учетом замечаний Ardi).

Вот на примере "Как вывести остатки на складах в списке номенклатуры?":

Процедура СписокНоменклатураПриПолученииДанных(Элемент, ОформленияСтрок)

       Запрос = Новый Запрос("ВЫБРАТЬ

       |        ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток,

       |        ТоварыНаСкладахОстатки.Номенклатура.Ссылка КАК Товар

       |ИЗ

       |        РегистрНакопления.ТоварыНаСкладах.Остатки( , Номенклатура В (&МассивТоваров))

       |                КАК ТоварыНаСкладахОстатки");        

       МассивНоменклатуры = Новый Массив;   // для передачи в параметр запроса

       Соответствие = Новый Соответствие;        // для заполнения остатков в строках

                                                                                               // табличного поля

       Для Каждого Строка из ОформленияСтрок Цикл

               МассивНоменклатуры.Добавить(Строка.ДанныеСтроки.Ссылка);

               Соответствие.Вставить(Строка.ДанныеСтроки.Ссылка, Строка);

       КонецЦикла;

       Запрос.УстановитьПараметр("МассивТоваров", МассивНоменклатуры);

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

       // Вывести остаток в строку, найденную в соответствии по номенклатуре из запроса.

       Пока Выборка.Следующий() Цикл

               Соответствие.Получить(Выборка.Товар.Ссылка).Ячейки.Остаток.Значение = Выборка.Остаток;

       КонецЦикла;        
КонецПроцедуры


С документом все очень похоже.
nazarenko
Цитата(Ardi @ 01.09.13, 15:16) необходимо зарегистрироваться для просмотра ссылки
Надо так:
|ИЗ
        |    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &ВыбСклад, Номенклатура В(&спНоменклатура), ХарактеристикаНоменклатуры В(&спХарактеристикаНоменклатуры)) КАК ТоварыНаСкладахОстатки


Выдает ошибку:
{(5, 5)}: Неверные параметры "РегистрНакопления.ТоварыНаСкладах.Остатки"
<<?>>РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &ВыбСклад, Номенклатура В(&спНоменклатура), ХарактеристикаНоменклатуры В(&спХарактеристикаНоменклатуры)) КАК ТоварыНаСкладахОстатки
Batchir
Ardi от руки написал, если внимательно посмотреть то "," надо заменить на "И"
nazarenko
Цитата(Ardi @ 01.09.13, 15:16) необходимо зарегистрироваться для просмотра ссылки
...
Если ведётся учет по характеристикам - то код неправильный.
Если указывается склад в табличной части - код неправильный.
А что показывает правильный остаток? Может в том месте остаток с учетом резервов?


Да, учет ведется по характеристикам. Как правильно?
Нет, склад не в табличной части (он в "шапке" документа).
Резервы не используются. Похоже, что остаток выдается не правильно там где
повторяется номенклатура, а характеристики разные.

Цитата(Vofka @ 01.09.13, 15:27) необходимо зарегистрироваться для просмотра ссылки
Запомните, что всегда стоит использовать параметры виртуальной таблицы, если это возможно. Т.е. в вашем случае условие из ГДЕ надо перенести туда, где у вас условие по складу находится (с учетом замечаний Ardi).

Вот на примере "Как вывести остатки на складах в списке номенклатуры?":
...


Спасибо, попробую.
Ardi
Цитата(nazarenko @ 01.09.13, 17:39) необходимо зарегистрироваться для просмотра ссылки
Да, учет ведется по характеристикам.

Отбор = Новый Структура();
Отбор.Вставить("Номенклатура",ОформлениеСтроки.ДанныеСтроки.Номенклатура);
Отбор.Вставить("ХарактеристикаНоменклатуры",ОформлениеСтроки.ДанныеСтроки.ХарактеристикаНоменклатуры);

Строки = СписокРаботников.НайтиСтроки(Отбор);
Если Строки.Количество() > 0 Тогда
     зн1=Строки[0].ОстатокНаВыбраномСкладе;
Иначе
     зн1 = "";
КонецЕсли;
nazarenko
Цитата(Ardi @ 01.09.13, 17:25) необходимо зарегистрироваться для просмотра ссылки
Отбор = Новый Структура();
Отбор.Вставить("Номенклатура",ОформлениеСтроки.ДанныеСтроки.Номенклатура);
Отбор.Вставить("ХарактеристикаНоменклатуры",ОформлениеСтроки.ДанныеСтроки.ХарактеристикаНоменклатуры);

Строки = СписокРаботников.НайтиСтроки(Отбор);
Если Строки.Количество() > 0 Тогда
     зн1=Строки[0].ОстатокНаВыбраномСкладе;
Иначе
     зн1 = "";
КонецЕсли;


Переделал:
    Отбор = Новый Структура();
    Отбор.Вставить("спНоменклатура", ОформлениеСтроки.ДанныеСтроки.Номенклатура);
    Отбор.Вставить("спХарактеристикаНоменклатуры", ОформлениеСтроки.ДанныеСтроки.ХарактеристикаНоменклатуры);

    Строки = ТЗ.НайтиСтроки(Отбор);
    Если Строки.Количество() > 0 Тогда
         зн1= Строки[0].ОстатокНаВыбраномСкладе;
    Иначе
         зн1 = "";
    КонецЕсли;


Выдает ошибку:
{Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(75)}: Ошибка при вызове метода контекста (НайтиСтроки)
            Строки = ТЗ.НайтиСтроки(Отбор);
по причине:
Неверное имя колонки
mister-x
необходимо зарегистрироваться для просмотра ссылки
чого тема, в якій обговорюються методика програмування створена в користувацькому розділі? а-я-яй 05040.gif
nazarenko
Всем спасибо - работает!

Цитата(mister-x @ 01.09.13, 20:49) необходимо зарегистрироваться для просмотра ссылки
необходимо зарегистрироваться для просмотра ссылки
чого тема, в якій обговорюються методика програмування створена в користувацькому розділі? а-я-яй 05040.gif


По ошибке (пардон).

Жаль что в верхнем меню нет значка "Программисту 8.х".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.