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

Как сделать условие?

Автор aboba174, 27 апр 2023, 15:18

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

aboba174

Здравствуйте. Я украл код с интернета чтобы товар перед записью проверялся есть ли он в регистре накопления.

У меня есть документ "ОказаниеУслуги" в котором в табличной части "ПереченьНоменклатуры" проверяется остаток в регистре накопления "ОстаткиМатериалов", и там при выборе у меня есть услуга и соответственно "Номенклатура".

У меня при выборе услуга, в скобочках пишется (услуга).

И я не знаю как мне отредактировать код, чтобы он не трогал "Услугу".

P.S К Номенклатуре у меня привязан "Вид номенклатуры" (Это Перечисление.).

Мой код в Документе "ОказаниеУслуги":

Процедура ОбработкаПроведения(Отказ, Режим)


//Движения.ОстаткиМатериалов.Записывать = Истина;   
//Движения.СтоимостьМатериалов.Записывать = Истина;
//Движения.Продажи.Записывать = Истина; 


Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл   

Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда

// регистр ОстаткиМатериалов Расход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;

// регистр СтоимостьМатериалов Расход
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
Движение.Цена = ТекСтрокаПереченьНоменклатуры.Количество * ТекСтрокаПереченьНоменклатуры.Цена; 

КонецЕсли;     

// Регистр Продажи
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаПереченьНоменклатуры.Номенклатура;
Движение.Клиент = Клиент;
Движение.Сотрудник = Сотрудник;
Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;
Движение.Выручка = ТекСтрокаПереченьНоменклатуры.Сумма;
//Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Стоимость * ТекСтрокаПереченьНоменклатуры.Количество;

КонецЦикла;         

//test

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



КонецПроцедуры



LexaK

aboba174, по идее у номенклатуры должен быть тип,
добавьте эту команду, см. код
    Запрос.Текст =
        "ВЫБРАТЬ
        |   ПереченьНоменклатуры.Номенклатура КАК Номенклатура,
        |   СУММА(ПереченьНоменклатуры.Количество) КАК Количество
        |ПОМЕСТИТЬ ПереченьНоменклатуры
        |ИЗ
        |   Документ.ОказаниеУслуги.ПереченьНоменклатуры КАК ПереченьНоменклатуры
        |ГДЕ
        |   ПереченьНоменклатуры.Ссылка = &Ссылка         
|/////попробуйте добавить эту команду
        |и Не ПереченьНоменклатуры.Номенклатура.Наименование Подобно ""%(услуга)%""
        |
        |СГРУППИРОВАТЬ ПО
        |   ПереченьНоменклатуры.Номенклатура
        |
        |ИНДЕКСИРОВАТЬ ПО
        |   Номенклатура
если помогло нажмите: Спасибо!

aboba174

LexaK, Все равно не дает провести документ

LexaK

aboba174, какие сообщения вам выводятся? скопируйте их сюда!
если помогло нажмите: Спасибо!

aboba174

LexaK, Не удалось провести "Оказание услуги 000000011 от 25.04.2023 21:41:51"!


LexaK

Цитата: aboba174 от 27 апр 2023, 15:37LexaK, Не удалось провести "Оказание услуги 000000011 от 25.04.2023 21:41:51"!

Вот!!! Ошибки что не хватает Количества по Услугам НЕТ!!!
первоначальная задача решена! что и требовалось!
если помогло нажмите: Спасибо!

aboba174

LexaK, Это я вам первую ошибку скинул, а после этого снизу вылазит сообщение: "товара лечение кариеса (услуга) недостаточно в количестве 1 шт."

LexaK

aboba174, вы изменение в код программы внесли? базу сохранили, перезапустили?
(и такое бывает)

выкладывайте сюда текст всего модуля документа.
если помогло нажмите: Спасибо!

aboba174

LexaK, Сохранял и перезапускал базу.


Процедура ОбработкаПроведения(Отказ, Режим)


//Движения.ОстаткиМатериалов.Записывать = Истина;   
//Движения.СтоимостьМатериалов.Записывать = Истина;
//Движения.Продажи.Записывать = Истина; 


Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл   

Если ТекСтрокаПереченьНоменклатуры.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Материал Тогда

// регистр ОстаткиМатериалов Расход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;

// регистр СтоимостьМатериалов Расход
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаПереченьНоменклатуры.Номенклатура;
Движение.Цена = ТекСтрокаПереченьНоменклатуры.Количество * ТекСтрокаПереченьНоменклатуры.Цена; 

КонецЕсли;     

// Регистр Продажи
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаПереченьНоменклатуры.Номенклатура;
Движение.Клиент = Клиент;
Движение.Сотрудник = Сотрудник;
Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;
Движение.Выручка = ТекСтрокаПереченьНоменклатуры.Сумма;
//Движение.Стоимость = ТекСтрокаПереченьНоменклатуры.Стоимость * ТекСтрокаПереченьНоменклатуры.Количество;

КонецЦикла;         

//test

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



КонецПроцедуры

Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
//{{__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.Запись") Тогда
// Заполнение шапки
Клиент = ДанныеЗаполнения.Клиент;                             
Сотрудник = ДанныеЗаполнения.Сотрудник;
Запись = ДанныеЗаполнения.Ссылка;
КонецЕсли;
//}}__КОНСТРУКТОР_ВВОД_НА_ОСНОВАНИИ
КонецПроцедуры

aboba174

LexaK, ЕЩе вот код как формируется в скобках (услуга) или (материал)

p.S она указана в Модуль Менеджера справочника "Номенклатура"

Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)         
// описываем какие  реквезиты будут учавствовать в формировании представляения документа "оказания услуги"
СтандартнаяОбработка = Ложь;
Поля.Добавить("Наименование");
Поля.Добавить("ВидНоменклатуры");   

КонецПроцедуры                 

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

Теги:

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

Рейтинг@Mail.ru

Поиск