Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
16 апр 2024, 08:16

Вывод дополнительной колонки, с остатком товара.

Автор СерьезныйЧеловек, 01 окт 2010, 23:20

0 Пользователей и 1 гость просматривают эту тему.

СерьезныйЧеловек

Здравствуйте! В УТ в документе Реализация товаров и услуг нужно добавить колонку, в которую нужно вывести остаток товара на дату документа, не являющейся реквизитом табличной части документов.
Вопрос вот в чем. Из какого регистра мне взять остаток товара.

СерьезныйЧеловек

И как вывести в колонку мой запрос, если данная колонка информационная, т.е не является реквизитом?

mohock

Цитата: СерьезныйЧеловек от 01 окт 2010, 23:20
Здравствуйте! В УТ в документе Реализация товаров и услуг нужно добавить колонку, в которую нужно вывести остаток товара на дату документа, не являющейся реквизитом табличной части документов.
Вопрос вот в чем. Из какого регистра мне взять остаток товара.

В зависимости от выбранного склада в документе. Причем, имей в виду, что склад можно указывать как в реквизитах, так и в ТЧ.
Если склад оптовый - Твары на складах, если Розничный - Твары в рознце, если НТТ - Товары в НТТ.
Если тебе не важна конкретика склада, мжно брать данные по всей организации из регистра Товары организаций.

mohock

Цитата: СерьезныйЧеловек от 02 окт 2010, 00:43
И как вывести в колонку мой запрос, если данная колонка информационная, т.е не является реквизитом?

Есть сбытие ТЧ - При выводе строки. Взгляни, как испльзуя его выводится артикул. У тебя тот же случай.
Ключевая фраза:
ЯчейкиСтрокиТабПоля.Артикул.УстановитьТекст(Номенклатура.Артикул);
У тебя это будет:
ЯчейкиСтрокиТабПоля.Остаток.УстановитьТекст(ОстатокНоменклатуры(Нменклатура));
Остатк - название твоей свобдной ячейки
Функция ОстатокНоменклатуры(Нменклатура) - рассчитывает остаток
Она должна сдержать запрос к регистру накопления с двумя параметрами - Дата накладной (или текущая дата) и ссылка на Номенклатуру.
Как это расположить в объекте:
В модуле объекта рисуешь функцию возвращающую остаток и экспртную процедуру заполнения поля остатка (см. Артикул)
Затем в сбытие При вывде строки в ТЧ товары вставляещь одну строчку с пследней процедурой.
 

СерьезныйЧеловек

Я сейчас попробую сделать. А вот например в документе Реализация Товров и Услуг у меня же несколько строк. Потом эту колонку нужно будет циклом заполнять?

mohock

Цитата: СерьезныйЧеловек от 02 окт 2010, 12:43
Я сейчас попробую сделать. А вот например в документе Реализация Товров и Услуг у меня же несколько строк. Потом эту колонку нужно будет циклом заполнять?

Как раз событие при выводе строки и делает этот цикл за тебя.  :D

СерьезныйЧеловек

Я чего-то не догоняю.
Еще раз можете рассказать структуру.

Вот я сделал Функцию, которая не работает:
ункция ОстатокНоменклатуры()
   Запрос=Новый Запрос;
Запрос.Текст=

"ВЫБРАТЬ
|   ТоварыОрганизацийОстатки.КоличествоОстаток
|ИЗ
|   РегистрНакопления.ТоварыОрганизаций.Остатки КАК ТоварыОрганизацийОстатки
|      ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
|      ПО (ТоварыОрганизацийОстатки.Номенклатура.Ссылка = РеализацияТоваровУслуг.Ссылка)" ;


Запрос.УстановитьПараметр("Дата",ЭлементыФормы.Дата);
Выборка=Запрос.Выполнить().Выгрузить();


Потом нужно написать в ПриВыводеСтроки вот это-
Товары.Остаток.УстановитьТекст(ОстатокНоменклатуры(Нменклатура))



СерьезныйЧеловек

Тут вот Артикул не так как Вы описали выводится:

Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

   Если мКолонкиТовары.Всего.Видимость Тогда
      ОформлениеСтроки.Ячейки.Всего.УстановитьТекст(ОбщегоНазначения.ФорматСумм(ДанныеСтроки.Сумма
                                          + ?(СуммаВключаетНДС, 0, ДанныеСтроки.СуммаНДС)));
   КонецЕсли;

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

КонецПроцедуры // ТоварыПриВыводеСтроки()

Я пересмотрел все, нигде явно не описано слово Артикул.

СерьезныйЧеловек

Ой извините, Акртикул выводится при помощи Процедуры - РаботаСДиалогами. И там как раз написана эта ф-я ЯчейкиСтрокиТабПоля.Артикул.УстановитьТекст. Но я почему то все равно никак не пойму как это все работает?

mohock

Цитата: СерьезныйЧеловек от 02 окт 2010, 18:24
Ой извините, Акртикул выводится при помощи Процедуры - РаботаСДиалогами. И там как раз написана эта ф-я ЯчейкиСтрокиТабПоля.Артикул.УстановитьТекст. Но я почему то все равно никак не пойму как это все работает?

:D :D :D :D
Ладно. Т.к. это весьма распространенная просьба наших клиентов, не имеющих ни какого представления о принципах работы 1С, и к тому-же они привыкли к другому на своих старых системах и хотят то-же видеть в 1С.
Вот как это делается:

В модуль документа РеализацияТоваровУслуг помещаем примерно такие функции и процедуры:

//RS:
Функция ОстатокНаСкладе(Номенклатура) Экспорт
ВидСклада = Склад.ВидСклада;
Если ВидСклада = Перечисления.ВидыСкладов.НТТ Тогда
   Текст = "ВЫБРАТЬ
           |   ТоварыВНТТОстатки.КоличествоОстаток КАК Количество
           |ИЗ
           |   РегистрНакопления.ТоварыВНТТ.Остатки(&Дата, ) КАК ТоварыВНТТОстатки
           |ГДЕ
           |   ТоварыВНТТОстатки.Склад = &Склад
           |   И ТоварыВНТТОстатки.Номенклатура = &Номенклатура";
ИначеЕсли ВидСклада = Перечисления.ВидыСкладов.Оптовый Тогда
   Текст = "ВЫБРАТЬ
           |   ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество
           |ИЗ
           |   РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата, ) КАК ТоварыНаСкладахОстатки
           |ГДЕ
           |   ТоварыНаСкладахОстатки.Склад = &Склад
           |   И ТоварыНаСкладахОстатки.Номенклатура = &Номенклатура";
ИначеЕсли ВидСклада = Перечисления.ВидыСкладов.Розничный Тогда
   Текст = "ВЫБРАТЬ
           |   ТоварыВРозницеОстатки.КоличествоОстаток КАК Количество
           |ИЗ
           |   РегистрНакопления.ТоварыВРознице.Остатки(&Дата, ) КАК ТоварыВРозницеОстатки
           |ГДЕ
           |   ТоварыВРозницеОстатки.Склад = &Склад
           |   И ТоварыВРозницеОстатки.Номенклатура = &Номенклатура";
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = Текст;
Запрос.УстановитьПараметр("Дата",Дата);
Запрос.УстановитьПараметр("Склад",Склад);
Запрос.УстановитьПараметр("Номенклатура",Номенклатура);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Количество = ?(Выборка.Следующий(),Выборка.Количество,0);
Возврат Количество;
КонецФункции

Функция ОстатокОрганизации(Номенклатура) Экспорт
Текст = "ВЫБРАТЬ
        |   ТоварыОрганизацийОстатки.КоличествоОстаток КАК Количество
        |ИЗ
        |   РегистрНакопления.ТоварыОрганизаций.Остатки(&Дата, ) КАК ТоварыОрганизацийОстатки
        |ГДЕ
        |   ТоварыОрганизацийОстатки.Организация = &Организация
        |   И ТоварыОрганизацийОстатки.Номенклатура = &Номенклатура";
Запрос = Новый Запрос;
Запрос.Текст = Текст;
Запрос.УстановитьПараметр("Дата",Дата);
Запрос.УстановитьПараметр("Организация",Организация);
Запрос.УстановитьПараметр("Номенклатура",Номенклатура);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Количество = ?(Выборка.Следующий(),Выборка.Количество,0);
Возврат Количество;
КонецФункции

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

Процедура ПоказатьОстатокОрганизации(КолонкиТабПоля, ЯчейкиСтрокиТабПоля, Номенклатура) Экспорт
Если КолонкиТабПоля.ОстатокОрганизации.Видимость Тогда
      Если ТипЗнч(Номенклатура) = Тип("СправочникСсылка.Номенклатура") Тогда
          Остаток = ОстатокОрганизации(Номенклатура);
         ЯчейкиСтрокиТабПоля.ОстатокОрганизации.УстановитьТекст(Остаток);
      Иначе
         ЯчейкиСтрокиТабПоля.ОстатокОрганизации.УстановитьТекст("");
      КонецЕсли;
КонецЕсли;   
КонецПроцедуры
//RS.

Здесь функции - это запросы на получение остатка номенклатуры. Объявленные Процедуры затем вставим в событие формы.
Обрати внимание на функции. В принципе их можно упростить (ради мизерного выигрыша в скорости), порвав текст и вставив в разрывы
переменные с наименованиями регистров... Но я намеренно этого не делал. Сделано это ради независимости кода и наглядности для
последующего сопровождения. В данном случае параллельность кода и наглядность важнее чем незаметный выигрыш в скорости.
Т.е. если надо будет изменить текст для одного из регистров это легко сделать не затрагивая запросы по другим регистрам.

Далее в табличной части Товары формы документа добавляем две колонки - ОстатокСклада и ОстатокОрганизации. Желательно,
чтобы два свойства колонки имели такие значения:
Данные - пусто;
ЭлементУправления = ПолеВвода;


Затем заходим в событие ТЧ Товары - ПриВыводеСтроки и попадаем в процедуру формы ТоварыПриВыводеСтроки.
В конце ее текста вставляем две наши строчки:

//RS:
   ПоказатьОстатокСклада(мКолонкиТовары, ОформлениеСтроки.Ячейки, ДанныеСтроки.Номенклатура);
   ПоказатьОстатокОрганизации(мКолонкиТовары, ОформлениеСтроки.Ячейки, ДанныеСтроки.Номенклатура);
//RS.

Ну вот и все.  :D

Да, кстати. Желательно выводить остатки с тремя знаками после запятой. Сообразишь где задать формат:D
И еще обрати внимание насколько медленнее стала выводиться на экран не пустая тч Товары в сохраненном документе.
Несколько усложнив текст наших процедур, а может создав дополнительные с этим можно побороться.
Идея в том, что если у документа не пустая ТЧ, то ее можно выгрузить в таблицу значений. Затем выполнить один
запрос (а не построчно, как у нас) по этим товарам и получить сразу остатки за один проход. При этом в конце
надо будет использовать уже другое событие - ПриПолученииДанных  :D
Удачи!

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск