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

Создание и заполнение документа по номенклатурам

Автор Sellen, 26 сен 2024, 13:54

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

Sellen

Нужно создать документ ввод остатков товаров и заполнить его по данным номенклатур. Если создавать и заполнять документ по данным номенклатур руками, то все создается хорошо, автоматически заполняются все необходимые поля: характеристика, серия, ставка ндс, номер гдт. Когда пытаюсь создать документ программно сам документ создается, но неправильно. Я также программно получаю все необходимые номенклатуры и добавляю их в документ, но при этом поля не заполняются, также надо отметить ввод остатков по оу и себестоимости.

Вот сам код обработки.
&НаСервере
Процедура СоздатьДокументПоДанным(ВидНоменклатуры, Организация, Склад) Экспорт

    // Создаем новый документ "Ввод остатков"
    ДокументОбъект = Документы.ВводОстатковТоваров.СоздатьДокумент();
ДокументОбъект.Дата = ТекущаяДата();

    // Устанавливаем реквизиты документа
    Если ЗначениеЗаполнено(Организация) Тогда
        ДокументОбъект.Организация = Справочники.Организации.НайтиПоНаименованию(Организация);
    КонецЕсли;

    Если ЗначениеЗаполнено(Склад) Тогда
        ДокументОбъект.Склад = Справочники.Склады.НайтиПоНаименованию(Склад);
КонецЕсли;   

    // Печать реквизитов для отладки
    Сообщить("Документ создан с реквизитами:");
Сообщить("Организация: " + Организация);
    Сообщить("Склад: " + Склад);

// Заполняем табличную часть всеми номенклатурами с выбранным видом и родителем "Номенклатуры с сайта"
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка КАК Номенклатура,
    |   Номенклатура.Артикул КАК Артикул
|ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |ГДЕ                                                           
    |   Номенклатура.ВидНоменклатуры = &ВидНоменклатуры
    |   И Номенклатура.Родитель = &Родитель";

    Запрос.УстановитьПараметр("ВидНоменклатуры", Справочники.ВидыНоменклатуры.НайтиПоНаименованию(ВидНоменклатуры));
    Запрос.УстановитьПараметр("Родитель", Справочники.Номенклатура.НайтиПоНаименованию("Номенклатуры с сайта"));

    РезультатЗапроса = Запрос.Выполнить().Выбрать();

Пока РезультатЗапроса.Следующий() Цикл
// Поиск количества упаковок для данной номенклатуры в табличной части по артикулу
        Количество = НайтиКоличествоПоАртикулу(РезультатЗапроса.Артикул);

        Если Количество = 0 Тогда
            Сообщить("Артикул: " + РезультатЗапроса.Артикул + " не найден в табличной части. Пропуск строки.");
            Продолжить;
        КонецЕсли;

        НоваяСтрока = ДокументОбъект.Товары.Добавить();

        НоваяСтрока.Номенклатура = РезультатЗапроса.Номенклатура;
        НоваяСтрока.КоличествоУпаковок = Количество;
                                                       
        Сообщить("Добавлена строка: Номенклатура - " + НоваяСтрока.Номенклатура + ", Количество - " + НоваяСтрока.КоличествоУпаковок);
КонецЦикла;

    // Записываем документ
Попытка
ДокументОбъект.Записать();
        Сообщить("Документ успешно создан: " + ДокументОбъект.Ссылка);
    Исключение
        Сообщить("Ошибка создания документа: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

alexandr_ll

Sellen, Нигде в вашем коде нет заполнения характеристик, серий и другого. Поэтому и не заполняются

fruitella

Можно и не заполнять характеристики, юзай бспшные процедуры. Посмотри, события при изменении номенклатуры в ТЧ ввода остатков. Юзай ту же процедуру и все заполниться автоматом.
Рекомендую научиться пользоваться Отладкой и готовыми конструкциями.

Sellen

fruitella, по моему, у меня проблема даже не в заполнении товаров документа, а в самом создании документа. Потому что если я создаю документ через 1С предприятие и добавляю в него товары, то поля характеристики, серии, ндс, номера гдт заполняются сами. При добавлении же товара в документ, который был создан обработкой, эти поля уже не добавляются. Я посмотрел через конфигуратор эти стандартную обработку создания документа, и там используется стандартная команда создать, кода которой нет в модуле формы. Попробовал прогнать команду по отладчику и там открывается очень много разных форм при создании документа.

Sellen

alexandr_ll, Я добавил заполнение этих полей, но они все равно не заполняются при выполнении кода
&НаСервере
Процедура СоздатьДокументПоДанным(ВидНоменклатуры, Организация, Склад) Экспорт

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

    Если ЗначениеЗаполнено(Склад) Тогда
        ДокументОбъект.Склад = Справочники.Склады.НайтиПоНаименованию(Склад);
    КонецЕсли;
   
    ДокументОбъект.Комментарий = "Ввод остатков собственных товаров";

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

    // Устанавливаем параметры запроса
    Запрос.УстановитьПараметр("ВидНоменклатуры", Справочники.ВидыНоменклатуры.НайтиПоНаименованию(ВидНоменклатуры));
    Запрос.УстановитьПараметр("Родитель", Справочники.Номенклатура.НайтиПоНаименованию("Номенклатуры с сайта"));

    // Выполняем запрос и обрабатываем результат
    РезультатЗапроса = Запрос.Выполнить().Выбрать();

    Пока РезультатЗапроса.Следующий() Цикл
        // Поиск количества упаковок для данной номенклатуры в табличной части по артикулу
        Количество = НайтиКоличествоПоАртикулу(РезультатЗапроса.Артикул);

        Если Количество = 0 Тогда
            Сообщить("Артикул: " + РезультатЗапроса.Артикул + " не найден в табличной части. Пропуск строки.");
            Продолжить;
        КонецЕсли;
       
        НоваяСтрока = ДокументОбъект.Товары.Добавить();
        НоваяСтрока.Характеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию("Не используются");
        НоваяСтрока.Серия = Справочники.СерииНоменклатуры.НайтиПоНаименованию("Не используются");
        НоваяСтрока.СтавкаНДС = РезультатЗапроса.СтавкаНДС;

        // Заполнение данных о номенклатуре и количестве
        НоваяСтрока.Номенклатура = РезультатЗапроса.Номенклатура;
        НоваяСтрока.КоличествоУпаковок = Количество;
        НоваяСтрока.Количество = Количество;
         
        // Вывод сообщений для отладки
        Сообщить("Добавлена строка: Номенклатура - " + НоваяСтрока.Номенклатура + ", Количество - " + НоваяСтрока.КоличествоУпаковок);
    КонецЦикла;
   
    // Записываем документ
    Попытка
        ДокументОбъект.Записать();
        Сообщить("Документ успешно создан: " + ДокументОбъект.Ссылка);
    Исключение
        Сообщить("Ошибка создания документа: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Максим75

Sellen, так Вам за это и написали, что в форме документа при вводе товара отрабатывает некое событие, в котором по выбранному товару и заполняется все нужное. Вам и посоветовали, найти обработчик события и скопировать себе в обработку. ну подшаманить его естественно.

Sellen

Максим75, скорее всего проблема не в заполнении документа, а в его создании. Когда я создаю его через клиента он создается нормально, и при добавлении товаров в этот документ поля заполняются сами, кроме количества, которого нет в номенклатуре. Когда я создаю документ ввод остатков товаров программно он создается как то неправильно, если его найти и попытаться добавить в него товар точно так же как и в документ, который создал руками, то выводится ошибка: поле объекта не обнаружено, я ошибку закрываю и товар вставляется, но поля не заполняются. Я посмотрел что происходит при создании документа - там вызывается стандартная команда создать, и как найти ее код я не знаю, потому что в модуле формы его нет.

alexandr_ll

Sellen, Характеристики и Серии номенклатуры - подчиненные справочники синтаксис работы с ними другой.
В табличной части есть реквизит "Аналитика учета номенклатуры", его тоже нужно учитывать.

Максим75

Sellen, конечно, когда создается документ интерактивно, то выполняется некий алгоритм, вот его необходимо найти и перенести в обработку, которая создает документ программно. есть много реквизитов, которые могут быть не видны на форме, но они заполняются и влияют на другие реквизиты. Посмотрите что в ПриОткрытии рисуется, особенно смотрите когда новый документ создается.

fruitella

Заходишь в событие при изменении номенклатуры и видишь процедуру которая вызывается, а в ней тупо копируешь кусок кода.

//В твоем цикле
КэшированныеЗначения = ОбработкаТабличнойЧастиКлиентСервер.ПолучитьСтруктуруКэшируемыеЗначения();

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

ОбработкаТабличнойЧастиСервер.ОбработатьСтрокуТЧ(НоваяСтрока, СтруктураДействий, КэшированныеЗначения);
//Конец цикла


&НаКлиентеНаСервереБезКонтекста
Функция ПараметрыПересчетаКоличестваЕдиниц(ХозяйственнаяОперация) //и эту функцию отдельно добавь

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


Теги:

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

Рейтинг@Mail.ru

Поиск