Подскажите, пожайлуста, как написать программку
с помощью которой выводились бы остатки (к-во) номенклатуры
в списке справочника номенклатура (рядом с каждым наименованием).
Для 1С: 8.2 УТП для Украины 1.2.9.1 от 23.08.2012.
В типовой конфигурации остатки выводятся внизу только
для одной текущей позиции.
Спасибо.
! | Правила, п.5. |
Боюсь, что с такой постановкой вопроса вам лучше обратиться к специалисту.
В документе "Реализация" и других нажать кнопку "Подбор".
Если я не ошибаюсь, то в какой-то книге Радченко (по-моему "Простые примеры разработки") есть пример, который демонстрирует то, что вам нужно.
Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
//РОМ
Если ДанныеСтроки.Ссылка.ЭтоГруппа Тогда
Возврат;
КонецЕсли;
мПоискОбъектовВСпискахДанных.СписокПриВыводеСтрокиСпискаОтбораДанных(Элемент, ОформлениеСтроки, ДанныеСтроки);
запрос = Новый Запрос;
если РольДоступна("ПолныеПрава") или ИмяПользователя() = "Менеджер по продажам2" Тогда
запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Валюта,
| ЦеныНоменклатурыСрезПоследних.Цена,
| ЦеныНоменклатурыСрезПоследних.ЕдиницаИзмерения,
| ЦеныНоменклатурыСрезПоследних.ТипЦен.Наименование,
| 1 КАК Поле1
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| Номенклатура = &Номенкл
| И ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| ЦеныНоменклатурыКонтрагентовСрезПоследних.Валюта,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.Цена,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.ЕдиницаИзмерения,
| ЦеныНоменклатурыКонтрагентовСрезПоследних.ТипЦен.Наименование,
| 2
|ИЗ
| РегистрСведений.ЦеныНоменклатурыКонтрагентов.СрезПоследних(, Номенклатура = &Номенкл) КАК ЦеныНоменклатурыКонтрагентовСрезПоследних
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| 3,
| ТоварыНаСкладахОстатки.КоличествоОстаток,
| 3,
| 3,
| 3
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| ,
| Номенклатура = &Номенкл
| И (&ВсеСклады
| ИЛИ Склад = &ВыбСклад)) КАК ТоварыНаСкладахОстатки
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| 4,
| ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток,
| 4,
| 4,
| 4
|ИЗ
| РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(
| ,
| Номенклатура = &Номенкл
| И (&ВсеСклады
| ИЛИ Склад = &ВыбСклад)) КАК ТоварыВРезервеНаСкладахОстатки";
Иначе
запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатурыСрезПоследних.Валюта,
| ЦеныНоменклатурыСрезПоследних.Цена,
| ЦеныНоменклатурыСрезПоследних.ЕдиницаИзмерения,
| ЦеныНоменклатурыСрезПоследних.ТипЦен.Наименование,
| 1 КАК Поле1
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| Номенклатура = &Номенкл
| И ТипЦен = &ТипЦен) КАК ЦеныНоменклатурыСрезПоследних
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| NULL,
| NULL,
| NULL,
| NULL,
| 2
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| 3,
| ТоварыНаСкладахОстатки.КоличествоОстаток,
| 3,
| 3,
| 3
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(
| ,
| Номенклатура = &Номенкл
| И (&ВсеСклады
| ИЛИ Склад = &ВыбСклад)) КАК ТоварыНаСкладахОстатки
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| 4,
| ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток,
| 4,
| 4,
| 4
|ИЗ
| РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(
| ,
| Номенклатура = &Номенкл
| И (&ВсеСклады
| ИЛИ Склад = &ВыбСклад)) КАК ТоварыВРезервеНаСкладахОстатки";
КонецЕсли;
Запрос.УстановитьПараметр("Номенкл",ДанныеСтроки.Ссылка);
Запрос.УстановитьПараметр("ТипЦен",Константы.ТипыЦенНоменклатурыРозница.Получить());
Запрос.УстановитьПараметр("ВсеСклады", ВыбСклад.Пустая());
Запрос.УстановитьПараметр("ВыбСклад", ВыбСклад);
ааа=запрос.Выполнить().Выгрузить();
ТоварОстаток=0;
ТоварРезерв=0;
Если ааа.Количество()>0 Тогда
ОформлениеСтроки.Ячейки.ЦенаРозничная.Значение= "";
ОформлениеСтроки.Ячейки.ЦенаЗакупочная.Значение= "";
ОформлениеСтроки.Ячейки.ОстатокТовара.Значение= "";
для каждого ббб из ааа цикл
если ббб.Поле1=1 Тогда
//если РольДоступна("ПолныеПрава") Тогда
ОформлениеСтроки.Ячейки.ЦенаРозничная.Значение= ""+ббб.Цена+" " +ббб.Валюта;
//КонецЕсли;
ИначеЕсли ббб.Поле1=2 Тогда
если РольДоступна("ПолныеПрава") или ИмяПользователя() = "Менеджер по продажам2" Тогда
ОформлениеСтроки.Ячейки.ЦенаЗакупочная.Значение= ""+ббб.Цена+" " +ббб.Валюта;
КонецЕсли;
ИначеЕсли ббб.Поле1=3 Тогда
ТоварОстаток=?(ббб.Цена=Null,0,ббб.Цена);
ИначеЕсли ббб.Поле1=4 Тогда
ТоварРезерв=?(ббб.Цена=Null,0,ббб.Цена);
КонецЕсли;
КонецЦикла;
Иначе
ОформлениеСтроки.Ячейки.ЦенаРозничная.Значение= "";
КонецЕсли;
ОстатокСРезевром=ТоварОстаток-ТоварРезерв;
ОформлениеСтроки.Ячейки.ОстатокТовара.Значение= ""+?(ОстатокСРезевром=0,"",ОстатокСРезевром);
ОформлениеСтроки.Ячейки.Резерв.Значение= ""+?(ТоварРезерв=0,"",ТоварРезерв);
//РОМ
КонецПроцедуры
Ост = Ит.СКД(СчетТМЦ,"К",,МестоХранения,ТекущийЭлемент());
! | правила п.12,13 |
! | Я не желаю читать правила... |
Спасибо, все получилось!!!
Есть мнение, что при работе нескольких пользователей
данная програмка существенно будет замедлять работу 1С!
И ее, как Вы ранее отметели, более правильно написать
через событие ПриПолученииДанных!
Но как это сделать???
Спасибо за ответ!
Поехали дальше
Процедура ПоказатьОстаткиВДокументе(ОформленияСтрок)
Массив = Новый Массив;
Для Каждого ОформлениеСтроки из ОформленияСтрок Цикл
Массив.Добавить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ТоварыНаСкладахОстатки.Номенклатура,
| ТоварыНаСкладахОстатки.КоличествоОстаток КАК ОстатокНаВыбраномСкладе,
| ТоварыНаСкладахОстатки1.КоличествоОстаток КАК ОстатокНаОстальныхСкладах
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад = &ВыбСклад) КАК ТоварыНаСкладахОстатки
| ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(, Склад <> &ВыбСклад) КАК ТоварыНаСкладахОстатки1
| ПО ТоварыНаСкладахОстатки.Номенклатура = ТоварыНаСкладахОстатки1.Номенклатура
|ГДЕ
| ТоварыНаСкладахОстатки.Номенклатура В(&спНоменклатура)";
Запрос.УстановитьПараметр("ВыбСклад",УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(ПараметрыСеанса.ТекущийПользователь, "ОсновнойСклад"));
Запрос.УстановитьПараметр("спНоменклатура",Массив);
ТЗ=запрос.Выполнить().Выгрузить();
Для Каждого ОформлениеСтроки из ОформленияСтрок Цикл
строкаТЗ=тз.Найти(Новый Структура("Номенклатура",ОформлениеСтроки.ДанныеСтроки.Номенклатура));
строкаТЗ=тз.Найти(ОформлениеСтроки.ДанныеСтроки.Номенклатура, "Номенклатура");
Если строкаТЗ = Неопределено Тогда
зн1=""; зн2="";
Иначе
зн1=строкаТЗ.ОстатокНаВыбраномСкладе;
зн2=строкаТЗ.ОстатокНаОстальныхСкладах;
КонецЕсли;
ОформлениеСтроки.Ячейки.ОстатокТекущегоСклада.Значение=зн1;
ОформлениеСтроки.Ячейки.ОстатокОстальныхСкладов.Значение=зн2;
КонецЦикла;
КонецПроцедуры
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
ПоказатьОстаткиВДокументе(ОформленияСтрок);
КонецПроцедуры
Я конечно, в 1С 8, плохо ориентируюсь!
Добавил "ДокументСписокПриПолученииДанных(..."
в справочнике номенклатура (форма сприска).
Эта процедура не выполняется!
Ее нужно вызывать (подключить/прицепить к событию)???
Нужно стать на табличную часть, открыть свойства - там привязываются процедуры.
Пишет ошибку:
Поле объекта не обнаружено (Номенклатура)
для строки
Массив.Добавить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
Массив.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка);
УРА!!!
ЗАРАБОТАЛО!!!
Всем спасибо! )))
Как бы еще цену прикрутить?
Правила, пункт 6. Закрыто.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua