19 февр. 2016 г.

ФИФО в запросе

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

Получить дату и время из строки

Типовая каша показывает как получить из “2016.19.02” и “23:03:00” значения Типа Дата, а именно 2016.19.02 23:03:00
ДокументОбъект.Дата = ПолучитьДатуВремяИзСтроки(ДокументXDTO.Дата, ВремяСтрока);
Функция ПолучитьДатуВремяИзСтроки(ДатаСтрока, ВремяСтрока = "")
ДатаВремя = Дата(1,1,1);
Попытка
Если ТипЗнч(ДатаСтрока) = Тип("Дата")
И ТипЗнч(ВремяСтрока) = Тип("Дата") Тогда
ДатаВремя = Дата(Формат(ДатаСтрока, "ДФ=dd.MM.yyyy") + " " + Формат(ВремяСтрока, "ДЛФ=T"));
КонецЕсли;
Если ДатаВремя = Дата(1,1,1) Тогда
Если ЗначениеЗаполнено(ВремяСтрока) Тогда
Время = СтрЗаменить(ВремяСтрока, ":", "");
ДатаВремя = Дата(СтрЗаменить(ДатаСтрока, "-", "") + Время);
Иначе
ДатаВремя = Дата(СтрЗаменить(ДатаСтрока, "-", "") + "000000");
КонецЕсли;
КонецЕсли;
Исключение
КонецПопытки;
Возврат ДатаВремя;
КонецФункции

Срез последних с физической таблицы регистра сведений

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

Удалить элемент дерева значений

Есть реквизит формы ДеревоЗначений соответственно оно отображено и на форме как Элементы.Дерево, есть так же ТабличныйДокумент на форме в который из Дерево перемещаются элементы дерева.
Документ1
Товар1
Товар2
Документ2
Товар1
Товар2
Товар3
задача при перетаскивании Элементов из дерева (Товар1, Товар2 и т.д.), что бы эти элементы удалялись из дерева.
Выполняем
Если Элементы.Дерево.ТекущиеДанные=Неопределено Тогда
                    Возврат;
КонецЕсли;
ЭлементыТекущегоУровняИерархии=?(Элементы.Дерево.ТекущиеДанные.ПолучитьРодителя()=Неопределено, 
ДеревоОтгрузка.ПолучитьЭлементы(), Элементы.Дерево.ТекущиеДанные.ПолучитьРодителя().ПолучитьЭлементы());
 
ТекИндекс=0;
 
Пока ЭлементыТекущегоУровняИерархии[ТекИндекс]<>Элементы.Дерево.ТекущиеДанные Цикл
ТекИндекс=ТекИндекс+1;
КонецЦикла;

ЭлементыТекущегоУровняИерархии.Удалить(ТекИндекс);

Сообщение пользователю 1С

Понадобилось при разработке управляемой формы уведомить пользователя не только сообщением о ошибке, а и указать на поле где содержит ошибка? Для этих целей подойдет объект СообщениеПользователю.
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Обрати внимание!";
если на клиенте
Сообщение.Поле = "Объект.Контрагент";
Сообщение.Сообщить();
или
Сообщение.Поле = "Контрагент";
Сообщение.ПутьКДанным= "Объект";
Сообщение.Сообщить();
если на сервере
Сообщение.Поле = "Контрагент";
Сообщение.УстановитьДанные(РеквизитФормыВЗначение("Объект"));
Сообщение.Сообщить();
или
Сообщение.Поле = "Контрагент";
Сообщение.ПутьКДанным = "Объект"; // нюанс в том, что на сервере очень часто не известно, что такое "Объект" поэтому лучше использовать .УстановитьДанные()
Сообщение.Сообщить();
А вот пример где нужно указать на поле в Табличной части
Объект.Запасы – Табличная часть
Номенклатура – поле, на которое хочу установить активность
Индекс  - в данном случаи нужно обращаться по индексу, а не по Номеру строки
Для Каждого Строка Из Объект.Запасы Цикл 
  Сообщение = Новый СообщениеПользователю;
   Индекс = Объект.Запасы.Индекс(Строка);
   Сообщение.Текст = "Пользователь, обрати внимание "+Строка.Номенклатура+" на это поле";
   Сообщение.Поле = "Объект.Запасы["+Индекс+"-1].Номенклатура";
   Сообщение.Сообщить();
КонецЦикла;
 

CopyPaste Copyright © 2017 - |- Шаблон создан O Pregador - |- Отредактирован myr4ik07