Написал программку по выводу остатков в документ "ПеремещениеТоваров". Не всегда показывает правильные остатки (в некоторых строчках не правильные). Медлено открывается документ.
Процедура ПоказатьОстаткиВДокументе(ОформленияСтрок)
ДатаРасчетов = дата;
Массив = Новый Массив;
Массив2 = Новый Массив;
ДляКаждого ОформлениеСтроки из ОформленияСтрок Цикл
Массив.Добавить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
Массив2.Добавить(ОформлениеСтроки.ДанныеСтроки.ХарактеристикаНоменклатуры);
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокНаВыбраномСкладе //,
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &ВыбСклад) КАК ТоварыНаСкладахОстатки
|ГДЕ
| ТоварыНаСкладахОстатки.Номенклатура В(&спНоменклатура) и ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры В(&спХарактеристикаНоменклатуры)";
Запрос.УстановитьПараметр("Дата", ДатаРасчетов);
Запрос.УстановитьПараметр("ВыбСклад", СкладОтправитель);
Запрос.УстановитьПараметр("спНоменклатура", Массив);
Запрос.УстановитьПараметр("спХарактеристикаНоменклатуры", Массив2);
ТЗ = запрос.Выполнить().Выгрузить();
ДляКаждого ОформлениеСтроки из ОформленияСтрок Цикл
строкаТЗ = тз.Найти(Новый Структура("Номенклатура", ОформлениеСтроки.ДанныеСтроки.Номенклатура));
строкаТЗ = тз.Найти(ОформлениеСтроки.ДанныеСтроки.Номенклатура, "Номенклатура");
Если строкаТЗ = НеопределеноТогда
зн1 = "";
Иначе
зн1 = строкаТЗ.ОстатокНаВыбраномСкладе;
КонецЕсли;
если ЭтотОбъект.Проведен тогда
зн1 = зн1 - ОформлениеСтроки.ДанныеСтроки.Количество;
КонецЕсли;
ОформлениеСтроки.Ячейки.ОстатокТовара.Значение = зн1; // остаток текущего складаКонецЦикла;
КонецПроцедуры
Живет на форуме
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0
Цитата(nazarenko @ 01.09.13, 15:11)
Медлено открывается документ.
Надо так:
|ИЗ| РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, Склад = &ВыбСклад, Номенклатура В(&спНоменклатура), ХарактеристикаНоменклатуры В(&спХарактеристикаНоменклатуры)) КАК ТоварыНаСкладахОстатки
Если ведётся учет по характеристикам - то код неправильный. Если указывается склад в табличной части - код неправильный. А что показывает правильный остаток? Может в том месте остаток с учетом резервов?
У нас здесь своя атмосфера...
Группа: Основатель
Сообщений: 14050
Из: Киев
Спасибо сказали: 4613 раз
Рейтинг: 3748.8
Запомните, что всегда стоит использовать параметры виртуальной таблицы, если это возможно. Т.е. в вашем случае условие из ГДЕ надо перенести туда, где у вас условие по складу находится (с учетом замечаний Ardi).
Вот на примере "Как вывести остатки на складах в списке номенклатуры?":
Процедура СписокНоменклатураПриПолученииДанных(Элемент, ОформленияСтрок)
Запрос = Новый Запрос("ВЫБРАТЬ
| ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток,
| ТоварыНаСкладахОстатки.Номенклатура.Ссылка КАК Товар
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки( , Номенклатура В (&МассивТоваров))
| КАК ТоварыНаСкладахОстатки");
МассивНоменклатуры = Новый Массив; // для передачи в параметр запроса
Соответствие = Новый Соответствие; // для заполнения остатков в строках // табличного поляДляКаждого Строка из ОформленияСтрок Цикл
МассивНоменклатуры.Добавить(Строка.ДанныеСтроки.Ссылка);
Соответствие.Вставить(Строка.ДанныеСтроки.Ссылка, Строка);
КонецЦикла;
Запрос.УстановитьПараметр("МассивТоваров", МассивНоменклатуры);
Выборка = Запрос.Выполнить().Выбрать();
// Вывести остаток в строку, найденную в соответствии по номенклатуре из запроса.Пока Выборка.Следующий() Цикл
Соответствие.Получить(Выборка.Товар.Ссылка).Ячейки.Остаток.Значение = Выборка.Остаток;
КонецЦикла;
КонецПроцедуры
... Если ведётся учет по характеристикам - то код неправильный. Если указывается склад в табличной части - код неправильный. А что показывает правильный остаток? Может в том месте остаток с учетом резервов?
Да, учет ведется по характеристикам. Как правильно? Нет, склад не в табличной части (он в "шапке" документа). Резервы не используются. Похоже, что остаток выдается не правильно там где повторяется номенклатура, а характеристики разные.
Цитата(Vofka @ 01.09.13, 15:27)
Запомните, что всегда стоит использовать параметры виртуальной таблицы, если это возможно. Т.е. в вашем случае условие из ГДЕ надо перенести туда, где у вас условие по складу находится (с учетом замечаний Ardi).
Вот на примере "Как вывести остатки на складах в списке номенклатуры?": ...
Живет на форуме
Группа: Пользователи
Сообщений: 4121
Из: Киев
Спасибо сказали: 957 раз
Рейтинг: 0
Цитата(nazarenko @ 01.09.13, 17:39)
Да, учет ведется по характеристикам.
Отбор = Новый Структура();
Отбор.Вставить("Номенклатура",ОформлениеСтроки.ДанныеСтроки.Номенклатура);
Отбор.Вставить("ХарактеристикаНоменклатуры",ОформлениеСтроки.ДанныеСтроки.ХарактеристикаНоменклатуры);
Строки = СписокРаботников.НайтиСтроки(Отбор);
Если Строки.Количество() > 0Тогда
зн1=Строки[0].ОстатокНаВыбраномСкладе;
Иначе
зн1 = "";
КонецЕсли;
Отбор = Новый Структура();
Отбор.Вставить("Номенклатура",ОформлениеСтроки.ДанныеСтроки.Номенклатура);
Отбор.Вставить("ХарактеристикаНоменклатуры",ОформлениеСтроки.ДанныеСтроки.ХарактеристикаНоменклатуры);
Строки = СписокРаботников.НайтиСтроки(Отбор);
Если Строки.Количество() > 0Тогда
зн1=Строки[0].ОстатокНаВыбраномСкладе;
Иначе
зн1 = "";
КонецЕсли;
Переделал:
Отбор = Новый Структура();
Отбор.Вставить("спНоменклатура", ОформлениеСтроки.ДанныеСтроки.Номенклатура);
Отбор.Вставить("спХарактеристикаНоменклатуры", ОформлениеСтроки.ДанныеСтроки.ХарактеристикаНоменклатуры);
Строки = ТЗ.НайтиСтроки(Отбор);
Если Строки.Количество() > 0Тогда
зн1= Строки[0].ОстатокНаВыбраномСкладе;
Иначе
зн1 = "";
КонецЕсли;
Выдает ошибку:
{Документ.ПеремещениеТоваров.Форма.ФормаДокумента.Форма(75)}: Ошибка при вызове метода контекста (НайтиСтроки)
Строки = ТЗ.НайтиСтроки(Отбор);
по причине:
Неверное имя колонки
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!