Имя: Пароль:
1C
1С v8
Ошибка при проведении документа. Операция не разрешена в предложении "ГДЕ"
0 ilyuza95
 
11.12.17
18:54
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.ОказаниеУслуги.МодульОбъекта(170)}: Ошибка при вызове метода контекста (Выполнить)
РезультатЗапроса = Запрос3.Выполнить();
по причине:
{(14, 8)}: Операция не разрешена в предложении "ГДЕ"
<<?>>ОстаткиМатериаловОстатки.КоличествоОстаток
1 Джинн
 
11.12.17
18:55
Продолжайте наблюдения.
2 ilyuza95
 
11.12.17
18:56
Процедура ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
Префикс = Обмен.ПолучитьПрефиксНомера();
КонецПроцедуры


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

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

// Создать менеджер временных таблиц
МенеджерВТ = Новый МенеджерВременныхТаблиц;
#Область НоменклатураДокумента
Запрос = Новый Запрос;

// Укажем, какой менеджер временных таблиц использует этот запрос
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

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

Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
#КонецОбласти

#Область ДвиженияДокумента
Запрос2 = Новый Запрос;
Запрос2.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос2.Текст =
"ВЫБРАТЬ
|    НоменклатураДокумента.Номенклатура,
|    НоменклатураДокумента.ВидНоменклатуры,
|        НоменклатураДокумента.НаборСвойств,
|    НоменклатураДокумента.КоличествоВДокументе,
|    НоменклатураДокумента.СуммаВДокументе,
|    ЕСТЬNULL(СтоимостьМатериаловОстатки.СтоимостьОстаток, 0) КАК Стоимость,
|    ЕСТЬNULL(ОстаткиМатериаловОстатки.КоличествоОстаток, 0) КАК Количество
|ИЗ
|    НоменклатураДокумента КАК НоменклатураДокумента
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СтоимостьМатериалов.Остатки(
|                ,
|                Материал В
|                    (ВЫБРАТЬ
|                        НоменклатураДокумента.Номенклатура
|                    ИЗ
|                        НоменклатураДокумента)) КАК СтоимостьМатериаловОстатки
|        ПО НоменклатураДокумента.Номенклатура = СтоимостьМатериаловОстатки.Материал
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки(
|                ,
|                Материал В
|                    (ВЫБРАТЬ
|                        НоменклатураДокумента.Номенклатура
|                    ИЗ
|                        НоменклатураДокумента)) КАК ОстаткиМатериаловОстатки
|        ПО НоменклатураДокумента.Номенклатура = ОстаткиМатериаловОстатки.Материал";

// Установим необходимость блокировки данных в регистрах СтоимостьМатериалов и ОстаткиМатериалов
Движения.СтоимостьМатериалов.БлокироватьДляИзменения = Истина;
Движения.ОстаткиМатериалов.БлокироватьДляИзменения = Истина;

// Запишем пустые наборы записей, чтобы читать остатки без учета данных в документе
Движения.СтоимостьМатериалов.Записать();
Движения.ОстаткиМатериалов.Записать();

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.Количество = 0 Тогда
СтоимостьМатериала = 0;

Иначе
СтоимостьМатериала = ВыборкаДетальныеЗаписи.Стоимость / ВыборкаДетальныеЗаписи.Количество;

КонецЕсли;

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

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

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

// Регистр Управленческий
// Первая проводка:         Д 62(ДебиторскаяЗадолженность) – К 90 (Капитал) Розничная сумма
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Основной.ДебиторскаяЗадолженность;
Движение.СчетКт = ПланыСчетов.Основной.Капитал;
Движение.Период = Дата;
Движение.Сумма = ВыборкаДетальныеЗаписи.СуммаВДокументе;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Клиенты] = Клиент;

// Вторая проводка: Д 90 (Капитал) – К 41 (Товары) – себестоимость
Движение = Движения.Управленческий.Добавить();
Движение.СчетДт = ПланыСчетов.Основной.Капитал;
Движение.СчетКт = ПланыСчетов.Основной.Товары;
Движение.Период = Дата;
Движение.Сумма = СтоимостьМатериала * ВыборкаДетальныеЗаписи.КоличествоВДокументе;
Движение.КоличествоКт = ВыборкаДетальныеЗаписи.КоличествоВДокументе;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Материалы] = ВыборкаДетальныеЗаписи.Номенклатура;

КонецЕсли;

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

КонецЦикла;

Движения.Записать();
#КонецОбласти

#Область КонтрольОстатков
Если Режим = РежимПроведенияДокумента.Оперативный Тогда

Запрос3 = Новый Запрос;
Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос3.Текст = "ВЫБРАТЬ
|        ОстаткиМатериаловОстатки.Материал,
|        ОстаткиМатериаловОстатки.НаборСвойств,
|        ОстаткиМатериаловОстатки.КоличествоОстаток
|ИЗ
|        РегистрНакопления.ОстаткиМатериалов.Остатки( , (Материал, НаборСвойств) В
|                (ВЫБРАТЬ
|                         НоменклатураДокумента.Номенклатура,
|                         НоменклатураДокумента.НаборСвойств
|                ИЗ
|                         НоменклатураДокумента) И Склад = &Склад)
|        КАК ОстаткиМатериаловОстатки
|ГДЕ
|       ОстаткиМатериаловОстатки.КоличествоОстаток";

Запрос3.УстановитьПараметр("Склад", Склад);

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток) + " единиц материала """ + ВыборкаДетальныеЗаписи.Материал + """" +" из набора свойств """ + ВыборкаДетальныеЗаписи.НаборСвойств + """";
Сообщение.Сообщить();

Отказ = Истина;

КонецЦикла;

КонецЕсли;
#КонецОбласти
КонецПроцедуры


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


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

Индекс = ПроверяемыеРеквизиты.Найти("ПереченьНоменклатуры.НаборСвойств");

Если Индекс <> Неопределено Тогда

ПроверяемыеРеквизиты.Удалить(Индекс);

КонецЕсли;

Индекс = 0;

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

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

Если Не ЗначениеЗаполнено(ТекСтрокаПереченьНоменклатуры.НаборСвойств) Тогда

Сообщение = Новый СообщениеПользователю();

Сообщение.Текст = "В строке " + Строка(Индекс+1) + " списка Перечень номенклатуры не заполнена колонка Набор свойств";

Сообщение.Поле = "ПереченьНоменклатуры[" + Строка(Индекс) + "].НаборСвойств";

Сообщение.УстановитьДанные(ЭтотОбъект);

Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЕсли;
Индекс = Индекс + 1;
КонецЦикла;
КонецПроцедуры
3 mehfk
 
11.12.17
18:59
|ГДЕ
|       ОстаткиМатериаловОстатки.КоличествоОстаток";


Вы уверены?
4 ilyuza95
 
11.12.17
19:00
Ошибка возникла после добавления команды ввода документа ОказаниеУслуги на основании элемента справочника Клиенты. Сейчас этот документ аписывается. но не проводится. В чем может быть роблема?
5 Джинн
 
11.12.17
19:08
(4) Вообще не связанные вещи.
6 Borteg
 
11.12.17
19:09
(4) смотри 3
7 ilyuza95
 
11.12.17
19:11
ОстаткиМатериаловОстатки.КоличествоОстаток < 0"

Нашла ошибку. спасибо:)
8 mikecool
 
11.12.17
19:16
напомнило что то "никак не привыкну к мысли, что люди, рожденные в этом веке, уже программируют" ))