Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Остатки товаров (в док. ПеремещениеТоваров)          
nazarenko Подменю пользователя
сообщение 01.09.13, 14:11
Сообщение #1

Говорящий
***
Группа: Пользователи
Сообщений: 85
Из: Днепропетровск
Спасибо сказали: 1 раз
Рейтинг: 0

Написал программку по выводу остатков в документ "ПеремещениеТоваров".
Не всегда показывает правильные остатки (в некоторых строчках не правильные).
Медлено открывается документ.


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

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


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


 ! 

Правила, п.3
 


Сообщение отредактировал logist - 02.09.13, 6:36

Ardi Подменю пользователя
сообщение 01.09.13, 15:16
Сообщение #2

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

Цитата(nazarenko @ 01.09.13, 15:11) *
Медлено открывается документ.

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


Если ведётся учет по характеристикам - то код неправильный.
Если указывается склад в табличной части - код неправильный.
А что показывает правильный остаток? Может в том месте остаток с учетом резервов?


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Спасибо сказали: nazarenko,

Vofka Подменю пользователя
сообщение 01.09.13, 15:27
Сообщение #3

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 13958
Из: Киев
Спасибо сказали: 4524 раз
Рейтинг: 3647.7

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

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

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

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

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

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

       |ИЗ

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

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

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

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

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

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

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

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

       КонецЦикла;

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

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

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

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

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

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


С документом все очень похоже.

Сообщение отредактировал Vofka - 01.09.13, 15:28

Спасибо сказали: nazarenko,

nazarenko Подменю пользователя
сообщение 01.09.13, 16:13
Сообщение #4

Говорящий
***
Группа: Пользователи
Сообщений: 85
Из: Днепропетровск
Спасибо сказали: 1 раз
Рейтинг: 0

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


Выдает ошибку:
{(5, 5)}: Неверные параметры "РегистрНакопления.ТоварыНаСкладах.Остатки"
<<?>>РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &ВыбСклад, Номенклатура В(&спНоменклатура), ХарактеристикаНоменклатуры В(&спХарактеристикаНоменклатуры)) КАК ТоварыНаСкладахОстатки

Batchir Подменю пользователя
сообщение 01.09.13, 16:17
Сообщение #5

Живет на форуме
Иконка группы
Группа: Команда
Сообщений: 3568
Из: Киев
Спасибо сказали: 1427 раз
Рейтинг: 0

Ardi от руки написал, если внимательно посмотреть то "," надо заменить на "И"

Спасибо сказали: nazarenko,

nazarenko Подменю пользователя
сообщение 01.09.13, 16:39
Сообщение #6

Говорящий
***
Группа: Пользователи
Сообщений: 85
Из: Днепропетровск
Спасибо сказали: 1 раз
Рейтинг: 0

Цитата(Ardi @ 01.09.13, 15:16) *
...
Если ведётся учет по характеристикам - то код неправильный.
Если указывается склад в табличной части - код неправильный.
А что показывает правильный остаток? Может в том месте остаток с учетом резервов?


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

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

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


Спасибо, попробую.

Ardi Подменю пользователя
сообщение 01.09.13, 17:25
Сообщение #7

Живет на форуме
***********
Гений телепатии и социального моделирования
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0

Цитата(nazarenko @ 01.09.13, 17:39) *
Да, учет ведется по характеристикам.

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

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


Сообщение отредактировал Ardi - 01.09.13, 17:40


Signature
Услуги 1С программиста 8.2, 7.7 (Плохо, дорого, очередь). Киев.

Спасибо сказали: nazarenko,

nazarenko Подменю пользователя
сообщение 01.09.13, 19:44
Сообщение #8

Говорящий
***
Группа: Пользователи
Сообщений: 85
Из: Днепропетровск
Спасибо сказали: 1 раз
Рейтинг: 0

Цитата(Ardi @ 01.09.13, 17:25) *
Отбор = Новый Структура();
Отбор.Вставить("Номенклатура",ОформлениеСтроки.ДанныеСтроки.Номенклатура);
Отбор.Вставить("ХарактеристикаНоменклатуры",ОформлениеСтроки.ДанныеСтроки.ХарактеристикаНоменклатуры);

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


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

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


Выдает ошибку:
{Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(75)}: Ошибка при вызове метода контекста (НайтиСтроки)
            Строки = ТЗ.НайтиСтроки(Отбор);
по причине:
Неверное имя колонки

mister-x Подменю пользователя
сообщение 01.09.13, 19:49
Сообщение #9

...
Иконка группы
Модератору Про1С (за заслуги в 2011 году)
Группа: Местный
Сообщений: 3477
Из: Тернопіль
Спасибо сказали: 1417 раз
Рейтинг: 0

офтоп
чого тема, в якій обговорюються методика програмування створена в користувацькому розділі? а-я-яй 05040.gif


Сообщение отредактировал mister-x - 01.09.13, 19:50

nazarenko Подменю пользователя
сообщение 01.09.13, 20:27
Сообщение #10

Говорящий
***
Группа: Пользователи
Сообщений: 85
Из: Днепропетровск
Спасибо сказали: 1 раз
Рейтинг: 0

Всем спасибо - работает!

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


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

Жаль что в верхнем меню нет значка "Программисту 8.х".

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 14.06.24, 19:18
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!