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

 Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ТекущаяДата()));
 Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ТекущаяДата()));

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

 Если РезультатЗапроса.Пустой() Тогда

 Запрос = Новый Запрос;
 Запрос.Текст =
 "ВЫБРАТЬ
 | ЦеныНоменклатурыСрезПоследних.Номенклатура,
 | ЦеныНоменклатурыСрезПоследних.Номенклатура.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
 | ЦеныНоменклатурыСрезПоследних.ВидЦены,
 | ЦеныНоменклатурыСрезПоследних.Характеристика,
 | ЦеныНоменклатурыСрезПоследних.Цена,
 | КурсыВалютСрезПоследних.Валюта,
 | КурсыВалютСрезПоследних.Курс
 |ИЗ
 | РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
 | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
 | ПО ЦеныНоменклатурыСрезПоследних.Валюта.Ссылка = КурсыВалютСрезПоследних.Валюта.Ссылка
 |ГДЕ
 | ЦеныНоменклатурыСрезПоследних.ВидЦены.Ссылка = &EUR
 |
 |ОБЪЕДИНИТЬ ВСЕ
 |
 |ВЫБРАТЬ
 | ЦеныНоменклатурыСрезПоследних.Номенклатура,
 | ЦеныНоменклатурыСрезПоследних.Номенклатура.ЕдиницаИзмерения,
 | ЦеныНоменклатурыСрезПоследних.ВидЦены,
 | ЦеныНоменклатурыСрезПоследних.Характеристика,
 | ЦеныНоменклатурыСрезПоследних.Цена,
 | КурсыВалютСрезПоследних.Валюта,
 | КурсыВалютСрезПоследних.Курс
 |ИЗ
 | РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
 | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
 | ПО ЦеныНоменклатурыСрезПоследних.Валюта = КурсыВалютСрезПоследних.Валюта
 |ГДЕ
 | ЦеныНоменклатурыСрезПоследних.ВидЦены.Ссылка = &USD
 |
 |ОБЪЕДИНИТЬ ВСЕ
 |
 |ВЫБРАТЬ
 | ЦеныНоменклатурыСрезПоследних.Номенклатура,
 | ЦеныНоменклатурыСрезПоследних.Номенклатура.ЕдиницаИзмерения,
 | ЦеныНоменклатурыСрезПоследних.ВидЦены,
 | ЦеныНоменклатурыСрезПоследних.Характеристика,
 | ЦеныНоменклатурыСрезПоследних.Цена,
 | КурсыВалютСрезПоследних.Валюта,
 | КурсыВалютСрезПоследних.Курс
 |ИЗ
 | РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
 | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
 | ПО ЦеныНоменклатурыСрезПоследних.Валюта = КурсыВалютСрезПоследних.Валюта
 |ГДЕ
 | ЦеныНоменклатурыСрезПоследних.ВидЦены.Ссылка = &Опт";

 Запрос.УстановитьПараметр("EUR", Справочники.ВидыЦен.НайтиПоРеквизиту("Идентификатор" , "ОптоваяEUR"));
 Запрос.УстановитьПараметр("USD", Справочники.ВидыЦен.НайтиПоРеквизиту("Идентификатор" , "ОптоваяИмпорт"));
 Запрос.УстановитьПараметр("Опт", Справочники.ВидыЦен.НайтиПоРеквизиту("Идентификатор" , "Оптовая"));

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

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

 Документ = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент();
 Документ.Дата = ТекущаяДата();
 Документ.Ответственный = Пользователи.ТекущийПользователь();
 Документ.Комментарий = "Создан обработкой установка цен номенклатуры.";
 Документ.Согласован = Истина;
 Документ.Статус = Перечисления.СтатусыУстановокЦенНоменклатуры.Согласован;
 ЦенаEUR = Справочники.ВидыЦен.НайтиПоРеквизиту("Идентификатор","ОптоваяEUR");
 ЦенаUSD = Справочники.ВидыЦен.НайтиПоРеквизиту("Идентификатор","ОптоваяИмпорт");
 ЦенаОпт = Справочники.ВидыЦен.НайтиПоРеквизиту("Идентификатор","Оптовая");
 ИнтернетЦена = Справочники.ВидыЦен.НайтиПоРеквизиту("Идентификатор","ИнтернетЦена");
 Пока Выборка.Следующий() Цикл
  СтрокаТЧ = Документ.Товары.Добавить();
  СтрокаТЧ.Номенклатура = Выборка.Номенклатура;
  СтрокаТЧ.Характеристика = Выборка.Характеристика;
  СтрокаТЧ.ВидЦены = ИнтернетЦена;
  СтрокаТЧ.Упаковка = Выборка.ЕдиницаИзмерения;
  Если Выборка.ВидЦены = ЦенаEUR И Выборка.ВидЦены <> ЦенаUSD И Выборка.ВидЦены <> ЦенаОпт Тогда
   СтрокаТЧ.Цена = Выборка.Цена * Выборка.Курс;
  ИначеЕсли Выборка.ВидЦены <> ЦенаEUR И Выборка.ВидЦены <> ЦенаОпт И Выборка.ВидЦены = ЦенаUSD Тогда
   СтрокаТЧ.Цена = Выборка.Цена * Выборка.Курс;
  ИначеЕсли Выборка.ВидЦены <> ЦенаEUR И Выборка.ВидЦены <> ЦенаUSD И Выборка.ВидЦены = ЦенаОпт Тогда
   СтрокаТЧ.Цена = Выборка.Цена * Выборка.Курс;
  КонецЕсли;
  СтрокаВЦ = Документ.ВидыЦен.Добавить();
  СтрокаВЦ.ВидЦены = ИнтернетЦена;

  Попытка
   Документ.Записать(РежимЗаписиДокумента.Проведение);
  Исключение
   Документ.Записать(РежимЗаписиДокумента.Запись);
   Сообщить(ОписаниеОшибки());
  КонецПопытки;

 КонецЦикла;
Сделал вот так, т.е. получаю на текущую дату запросом есть ли документ или нет и если результат пустой тогда создаем новый а если нет, тогда документ надо перезаписать, но как получить его не могу сообразить, может быть подскажите другой способ, либо с этим поможете разобраться? Формы у обработки нет, обработка работает по расписанию. Срочно нужна ваша помощь! Спасибо!
---
Не совсем понимаю логику вашей задачи. Вы находите существующий документ установки цен и просто перезаписываете его, зачем? Вы ведь в нем ничего не изменили, возможно нужно очистить ТЧ, перезаполнить и потом записать? Что вы имеете в виду под "записывает в Старые цены данные"?
Условие "Если Выборка.Цена <> Выборка.ЦенаИнтернет Тогда" уже не нужно, работайте с рассчитанными ценами ЦенаОПТ, ЦенаИмпорт, ЦенаEUR.
В ТЧ вы присваиваете СтрокаТЧ.Цена = Выборка.ЦенаИнтернет; - это старая Интернет цена, которая нужна для сравнения изменилась она или нет.
//Находим не нулевую установленную цену уже умноженную на курс
НоваяЦенаИнтернет = ?(Выборка.ЦенаОПТ = 0, ?(Выборка.ЦенаИмпорт= 0, ?(Выборка.ЦенаEUR= 0, 0,Выборка.ЦенаИмпорт) ,Выборка.ЦенаИмпорт) ,Выборка.ЦенаОПТ);
//проверяем, что найденная цена не равна нулю и старой цене, добавляем строку в ТЧ, присваиваем ее
Если Не НоваяЦенаИнтернет = 0 И Не НоваяЦенаИнтернет = Выборка.ЦенаИнтернет Тогда
//добавляем строку в ТЧ документа только если цена найдена и изменилась
СтрокаТЧ.Цена = НоваяЦенаИнтернет;
КонецЕсли;
---
весь код выполняйте в любом случае, а документ создавайте только в том случае, когда результат первого запроса пустой.

Если результат запроса не пустой, то из него берите ссылку на документ, получайте объект и заполняйте.
---
Я правильно понимаю что надо пропустить вот эту строку Документ = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент(); ?
---
ее не нужно пропускать, ее нужно выполнить в случае, когда результат запроса - пустой
---
В чем именно у вас проблема? По вашим словам у вас каждый день только один документ установки цен, значит из первого запроса получаете выборку с одной ссылкой, если документ уже создан, затем ДокументОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект() и работаете с ним как с созданным ниже документом.
---
ДокументОбъект = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект() и работаете с ним как с созданным ниже документом. По условию задачи надо перезаписывать документ, если делаю вот так ругается что метод объекта не обнаружен.
---
А в отладчике не смотрели, "ВыборкаДетальныеЗаписи.Ссылка" точно ссылка на нужный документ. По запросу там должна она быть ссылка, но мало ли...
---
Если же нужно дополнительно идентифицировать документ по комментарию в первом запросе, добавьте еще одно условие через ПОДОБНО, а при первичном создании пишите идентификатор в комментарий.
---
Все парни разобрался, все работает, спасибо вам огромное! Есть еще одно условие не могу понять как это реализовать?
Обработка должна выполнять проверку на изменение цены, если цена по товару Х не меняется, то этот товар не должен присутствовать в установке цен. Таким образом, обработка должна фиксировать только те товары, по которым после пересчета по актуальному курсу ИнтернетЦена изменилась. Подскажите пожалуйста. как правильно это сделать?
---
Получить "новые" цены, совместить первый и второй запросы, проверить различие цен с новыми.
как именно - домашнее задание.
---
У вас всегда заполнены все три вида цены или есть ситуации когда заполняется только цена по определенной валюте?
---
есть ситуации когда заполняется только цена по определенной валюте? Разные ситуации, не всегда заполнены все три вида цен.
---
Попробуйте переписать второй запрос в таком виде:

 ВЫБРАТЬ
 ЦеныНоменклатурыСрезПоследних.Номенклатура,
 ЦеныНоменклатурыСрезПоследних.Номенклатура.ЕдиницаИзмерения,
 ЦеныНоменклатурыСрезПоследних.ВидЦены,
 ЦеныНоменклатурыСрезПоследних.Характеристика,
 ЦеныНоменклатурыСрезПоследних.Цена,
 ВЫБОР КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены.Идентификатор = "Оптовая"
  ТОГДА ЦеныНоменклатурыСрезПоследних.Цена * КурсыВалютСрезПоследних.Курс
 ИНАЧЕ 0
 КОНЕЦ КАК ЦенаОПТ,
 ВЫБОР КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены.Идентификатор= "ОптоваяИмпорт"
  ТОГДА ЦеныНоменклатурыСрезПоследних.Цена * КурсыВалютСрезПоследних.Курс
 ИНАЧЕ 0
 КОНЕЦ КАК ЦенаИмпорт,
 ВЫБОР КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены.Идентификатор = "ОптоваяEUR"
  ТОГДА ЦеныНоменклатурыСрезПоследних.Цена * КурсыВалютСрезПоследних.Курс
 ИНАЧЕ 0
 КОНЕЦ КАК ЦенаEUR,
 ВЫБОР КОГДА ЦеныНоменклатурыСрезПоследних.ВидЦены.Идентификатор= "ИнтернетЦена"
  ТОГДА ЦеныНоменклатурыСрезПоследних.Цена
 ИНАЧЕ 0
 КОНЕЦ КАК ЦенаИнтернет,
 КурсыВалютСрезПоследних.Валюта,
 КурсыВалютСрезПоследних.Курс
ИЗ
 РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
 ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
 ПО ЦеныНоменклатурыСрезПоследних.Валюта = КурсыВалютСрезПоследних.Валюта
ГДЕ
 ЦеныНоменклатурыСрезПоследних.ВидЦены.Ссылка В (&МассивЦен)

Получите все четыре цены одной строкой. Дальше сравнивайте рассчитанные ненулевые цены с Интернет ценой и добавляйте строку в документ, если они отличаются. В МассивЦен передайте ссылки на 4 цены.
---
Сделал вот так:
 Запрос = Новый Запрос;
 Запрос.Текст =
 "ВЫБРАТЬ
 | УстановкаЦенНоменклатуры.Дата КАК Дата,
 | УстановкаЦенНоменклатуры.Ссылка КАК Ссылка
 |ИЗ
 | Документ.УстановкаЦенНоменклатуры КАК УстановкаЦенНоменклатуры
 |ГДЕ
 | УстановкаЦенНоменклатуры.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";

 Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ТекущаяДата()));
 Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ТекущаяДата()));

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

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

   КонецПопытки;
  КонецЕсли
Почему-то обработка записывает в Старые цены данные?
---
Не совсем понимаю логику вашей задачи. Вы находите существующий документ установки цен и просто перезаписываете его, зачем? Вы ведь в нем ничего не изменили, возможно нужно очистить ТЧ, перезаполнить и потом записать? Что вы имеете в виду под "записывает в Старые цены данные"?
Условие "Если Выборка.Цена <> Выборка.ЦенаИнтернет Тогда" уже не нужно, работайте с рассчитанными ценами ЦенаОПТ, ЦенаИмпорт, ЦенаEUR.
В ТЧ вы присваиваете СтрокаТЧ.Цена = Выборка.ЦенаИнтернет; - это старая Интернет цена, которая нужна для сравнения изменилась она или нет.
//Находим не нулевую установленную цену уже умноженную на курс
НоваяЦенаИнтернет = ?(Выборка.ЦенаОПТ = 0, ?(Выборка.ЦенаИмпорт= 0, ?(Выборка.ЦенаEUR= 0, 0,Выборка.ЦенаИмпорт) ,Выборка.ЦенаИмпорт) ,Выборка.ЦенаОПТ);
//проверяем, что найденная цена не равна нулю и старой цене, добавляем строку в ТЧ, присваиваем ее
Если Не НоваяЦенаИнтернет = 0 И Не НоваяЦенаИнтернет = Выборка.ЦенаИнтернет Тогда
//добавляем строку в ТЧ документа только если цена найдена и изменилась
СтрокаТЧ.Цена = НоваяЦенаИнтернет;
КонецЕсли;
---
Спасибо Вам огромное, все работает!!!