Версия для печати темы (https://pro1c.org.ua/index.php?s=ef2d469bb95051281325127cdc06511c&showtopic=9247)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ УТП остатки номенклатуры в списке справочника

Автор: nazarenko 07.10.12, 13:14

Подскажите, пожайлуста, как написать программку
с помощью которой выводились бы остатки (к-во) номенклатуры
в списке справочника номенклатура (рядом с каждым наименованием).
Для 1С: 8.2 УТП для Украины 1.2.9.1 от 23.08.2012.
В типовой конфигурации остатки выводятся внизу только
для одной текущей позиции.

Спасибо.


 ! 

Правила, п.5.
 

Автор: Vofka 07.10.12, 13:30

Боюсь, что с такой постановкой вопроса вам лучше обратиться к специалисту.

Автор: Ardi 07.10.12, 13:56

В документе "Реализация" и других нажать кнопку "Подбор".

Автор: nazarenko 07.10.12, 14:22

Цитата(Ardi @ 07.10.12, 14:56) *
В документе "Реализация" и других нажать кнопку "Подбор".


При нажатии кнопки подбор остаток можно увидеть
только по одной текущей позиции.
А нужно что бы при открытии справочника "Номенклатура"
(через меню Справочники-Номенклатура) остатки отображались рядом с наименованием каждого товара!
Очень нужно!

Автор: Ardi 07.10.12, 14:30

Цитата(nazarenko @ 07.10.12, 15:22) http://pro1c.org.ua/index.php?act=findpost&pid=57805
При нажатии кнопки подбор остаток можно увидеть
только по одной текущей позиции.

Нифига подобного, там варианты.

Автор: nazarenko 07.10.12, 14:37

Цитата(Vofka @ 07.10.12, 14:30) *
Боюсь, что с такой постановкой вопроса вам лучше обратиться к специалисту.


Я сам программист (в 1С 7.7 программирую более 10 лет!).
А вот с 8-ой пока не очень. Что называется 1-раз в первый класс!

Автор: Vofka 07.10.12, 14:57

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

Автор: nazarenko 07.10.12, 16:00

Цитата(Ardi @ 07.10.12, 15:30) http://pro1c.org.ua/index.php?act=findpost&pid=57807
Если я не ошибаюсь, то в какой-то книге Радченко (по-моему "Простые примеры разработки") есть пример, который демонстрирует то, что вам нужно.


Спасибо за наводку!

Автор: Ardi 07.10.12, 17:09

Цитата(nazarenko @ 07.10.12, 17:00) http://pro1c.org.ua/index.php?act=findpost&pid=57814
Я сам программист (в 1С 7.7 программирую более 10 лет!).
А вот с 8-ой пока не очень. Что называется 1-раз в первый класс!

Вот немного неправильный вариант. Правильно делать "При получении данных"
Процедура СписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    //РОМ    
    Если ДанныеСтроки.Ссылка.ЭтоГруппа Тогда
        Возврат;
    КонецЕсли;
    мПоискОбъектовВСпискахДанных.СписокПриВыводеСтрокиСпискаОтбораДанных(Элемент, ОформлениеСтроки, ДанныеСтроки);
    
    запрос = Новый Запрос;
    если  РольДоступна("ПолныеПрава") или ИмяПользователя() = "Менеджер по продажам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,"",ТоварРезерв);        
    //РОМ
КонецПроцедуры

Автор: nazarenko 07.10.12, 18:16

Цитата(Ardi @ 07.10.12, 18:09) *
В подборе можно видеть остатки и резервы по всем сразу.


ОГО какая БОЬШАЯ!!!
Спасибо за труды!
А нельзя как нибудь по "легче" написать?, пардон ))).

Что то типа как в 7.7
Ост = Ит.СКД(СчетТМЦ,"К",,МестоХранения,ТекущийЭлемент());

)))???

Так же не понятна фраза "При получении данных"?
Эта название процедуры?

Пишет ошибка
{Справочник.Номенклатура.Форма.ФормаСписка.Форма(1020,50)}: Переменная не определена (ВыбСклад)

Не выбран склад!
А как написать по всем складам?


 ! 

правила п.12,13
 

Автор: nazarenko 07.10.12, 22:28


 ! 

Я не желаю читать правила...
 

Автор: nazarenko 08.10.12, 19:00

Цитата(nazarenko @ 07.10.12, 23:28) *


ПРОЧЕЛ ПРАВИЛА!!! уже 2-а раза )))

Автор: nazarenko 08.10.12, 22:38

Спасибо, все получилось!!!

Есть мнение, что при работе нескольких пользователей
данная програмка существенно будет замедлять работу 1С!

И ее, как Вы ранее отметели, более правильно написать
через событие ПриПолученииДанных!

Но как это сделать???

Спасибо за ответ!

Автор: Ardi 08.10.12, 23:20

Поехали дальше

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

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

Автор: nazarenko 09.10.12, 0:01

Я конечно, в 1С 8, плохо ориентируюсь!
Добавил "ДокументСписокПриПолученииДанных(..."
в справочнике номенклатура (форма сприска).
Эта процедура не выполняется!
Ее нужно вызывать (подключить/прицепить к событию)???

Автор: Ardi 09.10.12, 0:32

Нужно стать на табличную часть, открыть свойства - там привязываются процедуры.

Автор: Fynjy 09.10.12, 6:44

Цитата(Ardi @ 07.10.12, 18:09) *
Вот немного неправильный вариант. Правильно делать "При получении данных"

Ацкий код ...

Автор: nazarenko 09.10.12, 9:16

Пишет ошибку:
Поле объекта не обнаружено (Номенклатура)
для строки

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


Для меня это вообще загадка природы! )))
Что там надо писать?

Автор: Vofka 09.10.12, 9:21

Цитата(nazarenko @ 09.10.12, 10:16) *
Что там надо писать?

Телепатирую... 10%..50%...100% complete!!!
Массив.Добавить(ОформлениеСтроки.ДанныеСтроки.Ссылка);

Автор: nazarenko 09.10.12, 9:36

УРА!!!
ЗАРАБОТАЛО!!!

Всем спасибо! )))

Как бы еще цену прикрутить?

Автор: sava1 09.10.12, 10:12

Цитата(nazarenko @ 09.10.12, 10:36) *
Как бы еще цену прикрутить?

добавить в запрос выборку из регистра сведений ценыНоменклатуры

Автор: Vofka 09.10.12, 10:16

Правила, пункт 6. Закрыто.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua