Некоторые картинки не загружаются из РФ и РК, используйте VPN.
Показаны сообщения с ярлыком 1СЗапрос. Показать все сообщения
Показаны сообщения с ярлыком 1СЗапрос. Показать все сообщения

пятница, 17 марта 2023 г.

1СЗаготовока запрос свободная секунда (список секунд за дату)

Была мысль сделать проверку времени документа и подставлять свободные даты. В ходе размышлений, пришел к выводу что мне это не надо и забросил, а вот код выдающий список секунд за дату я решил не выбрасывать. А потом пришел к выводу что надо и переделал

Функция ПолучитьДатуДокумента()
  Если НЕ ЭтоНовый() Тогда
    ШестьдесятСекундТЗ=Новый ТаблицаЗначений;
    ШестьдесятСекундТЗ.Колонки.Добавить("Секунд",Новый ОписаниеТипов("Число"));
    Секунд=0;
    Пока Секунд<=59 цикл
      ШестьдесятСекундТЗ.Добавить().Секунд=Секунд;
      Секунд=Секунд+1;  
    КонецЦикла;
      

    Запрос = Новый Запрос;
    Запрос.Текст = 
      "ВЫБРАТЬ
      |  секунды.секунд КАК секунд
      |ПОМЕСТИТЬ ШестьдесятСекунд
      |ИЗ
      |  &ШестьдесятСекунд КАК секунды
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |  ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&Дата, ДЕНЬ), СЕКУНДА, часов.часы * минут.минуты * секунд.секунды) КАК СекундаДня
      |ПОМЕСТИТЬ ДатаПоСекундам
      |ИЗ
      |  (ВЫБРАТЬ
      |    секунды.секунд КАК часы
      |  ИЗ
      |    ШестьдесятСекунд КАК секунды
      |  ГДЕ
      |    секунды.секунд <= 23) КАК часов,
      |  (ВЫБРАТЬ
      |    секунды.секунд КАК минуты
      |  ИЗ
      |    ШестьдесятСекунд КАК секунды) КАК минут,
      |  (ВЫБРАТЬ
      |    секунды.секунд КАК секунды
      |  ИЗ
      |    ШестьдесятСекунд КАК секунды) КАК секунд
      |;
      |
      |////////////////////////////////////////////////////////////////////////////////
      |ВЫБРАТЬ
      |  ВЫБОР
      |    КОГДА КоличествоДатТекущегоДокумента.Количество = 0
      |      ТОГДА &Дата
      |    ИНАЧЕ МИНИМУМ(ДатаПоСекундам.СекундаДня)
      |  КОНЕЦ КАК НоваяДата
      |ИЗ
      |  (ВЫБРАТЬ
      |    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ACG_ЗаказНаПроизводство.Дата) КАК Количество
      |  ИЗ
      |    Документ.ACG_ЗаказНаПроизводство КАК ACG_ЗаказНаПроизводство
      |  ГДЕ
      |    ACG_ЗаказНаПроизводство.Дата = &Дата
      |    И ACG_ЗаказНаПроизводство.Ссылка <> &Ссылка) КАК КоличествоДатТекущегоДокумента,
      |  ДатаПоСекундам КАК ДатаПоСекундам
      |ГДЕ
      |  НЕ ДатаПоСекундам.СекундаДня В
      |        (ВЫБРАТЬ РАЗЛИЧНЫЕ
      |          ACG_ЗаказНаПроизводство.Дата КАК Дата
      |        ИЗ
      |          Документ.ACG_ЗаказНаПроизводство КАК ACG_ЗаказНаПроизводство
      |        ГДЕ
      |          ACG_ЗаказНаПроизводство.Дата >= НАЧАЛОПЕРИОДА(&дата, ДЕНЬ)
      |          И ACG_ЗаказНаПроизводство.Дата <= КОНЕЦПЕРИОДА(&дата, ДЕНЬ))
      |
      |СГРУППИРОВАТЬ ПО
      |  КоличествоДатТекущегоДокумента.Количество";

    Запрос.УстановитьПараметр("Дата", Дата);
    Запрос.УстановитьПараметр("ШестьдесятСекунд",ШестьдесятСекундТЗ);
        Запрос.УстановитьПараметр("Ссылка",Ссылка);

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

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
      Если ВыборкаДетальныеЗаписи.Количество()=0 Тогда
      НоваяДата=Дата;
      Сообщить("Необходимо изменить время/дату документа, программно не получается - лапки");
    Иначе
      НоваяДата=РезультатЗапроса[0].НоваяДата;    
    КонецЕсли;
  ИНаче
    НоваяДата=ТекущаяДата();
  КонецЕсли;
  Возврат(НоваяДата);
КонецФункции

Банально и просто

воскресенье, 21 ноября 2021 г.

1С Нумерация в запросе (УФ)

На платформе 8.3 появилась давно возможность нумерации строк прямо в запросе, все хорошо, но нумерация идет от 1, а мне нужно было от нуля. Решение оказалось банальным, равно как и сортировка записей во временной таблице:

суббота, 6 июля 2019 г.

1CОшибка "код справочника стал неуникальным"

Последнее время чаще стала вылезать ошибка "код справочника стал неуникальным" при обновлении, в принципе особых проблем она не доставляет, но раздражает.
В ручную перебирать справочник очень муторно, поэтому я накидал простенький запрос, который выявляет совпадение кода при разных ссылках (на примере справочника ДоговорыКонтрагентов):


ВЫБРАТЬ
 ДоговорыКонтрагентов.Ссылка,
 ДоговорыКонтрагентов1.Ссылка КАК Ссылка1,
 ДоговорыКонтрагентов.Код,
 ДоговорыКонтрагентов1.Код КАК Код1
ИЗ
 Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов1
  ПО ДоговорыКонтрагентов.Код = ДоговорыКонтрагентов1.Код
   И ДоговорыКонтрагентов.Ссылка <> ДоговорыКонтрагентов1.Ссылка


понедельник, 17 апреля 2017 г.

1СЗапрос Реквизит параметра составного типа

Задача:
Выполнить выборку доков продаж/покупок по артикулу. На входе элемент справочника Номенклатура. Для получения необходимой инфы целесообразней использовать Хозрасчетный регистр по Субконто, нежели перебирать ТЧ всех документом.
Собственно по элементу справочника я получаю данные, но как их получить по Артикулу элемента переданного в запрос в качестве параметра с составным типом?

вторник, 30 июня 2015 г.

1С получить список просроченных заказов


Процедура ПолучитьДокументыПоСтд()
 СрокОплатыСравнение = 2;// 1 - Неважно 2 - Просрочен (более чем на)
 СрокОтгрузкиСравнение = 1;// 1 - Неважно
 НаличиеРезервов = 3;// 1 - Неважно 3 - С резервами
 РазмещениеРезервов = 1; // 1 - На складах и в заказах
 СостояниеОплаты = 2;// 1 - Неважно 2 - Не оплачен полностью (неоплачен либо оплачен частично)
 СостояниеОтгрузки = 1; // 1 - Неважно
    ДатаНач = НачалоДня(ЭтотОбъект.РекДатаНач);//начало периода отбора месяцназад
 ДатаКон = КонецДня(ЭтотОбъект.РекДатаКон);//конец периода отбора месяцвперед
 ПустаяДата=Дата('00010101');
 ДатаОплаты=НачалоДня(ТекущаяДата());
 ДатаОтгрузки=НачалоДня(ТекущаяДата());
 ПричинаЗакрытияЗаказа = Справочники.ПричиныЗакрытияЗаказов.ПустаяСсылка();
 //сообщить(""+ДатаНач+" "+ДатаКон+"");

1С получить список учетных записей электронной почты по пользователю


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


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

//Также в 1С есть функция возвращающая список доступных УЗ
//ОбщиеМодули.УправлениеЭлектроннойПочтой.ПолучитьДоступныеУчетныеЗаписи(ТекущийПользователь)
//Сами читаем, и пытаемся понять что оно делает


пятница, 26 июня 2015 г.

1С Вычесть рабочие дни на основе ПК (НеВЗапросе)



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

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

//Использование
Процедура ПолучитьТриДняНазад()
 ОткатитьНазадНа=3;//3 дня
 Сообщить(НачалоДня(ДваМесяцаРабочихДней[ДваМесяцаРабочихДней.Количество()-ОткатитьНазадНа-1]))
КонецПроцедуры


//Вариант самой 1С (нашел в форме отбора просроченных заказов)
Процедура ДниПросрочки()
 ОткатитьНазадНа=3;//3 дня
 //Пытаемся учитывать только рабочие дни по календарю
 ПолучитьДаты = Новый Запрос;
  ПолучитьДаты.Текст = 
  "ВЫБРАТЬ РАЗРЕШЕННЫЕ
  | РегламентированныйПроизводственныйКалендарь.Год
  |ИЗ
  | РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
  |ГДЕ
  | РегламентированныйПроизводственныйКалендарь.ДатаКалендаря МЕЖДУ &НачГода И &КонГода";
  
 ПолучитьДаты.УстановитьПараметр("НачГода",НачалоГода(ТекущаяДата()));
 ПолучитьДаты.УстановитьПараметр("КонГода",КонецГода(ТекущаяДата()));
 
 ПолучилиДаты = ПолучитьДаты.Выполнить();
 Если ПолучилиДаты.Пустой() Тогда
   ТребуемаяДатаОплаты=НачалоДня(ТекущаяДата()-24*60*60*ОткатитьНазадНа);
   //ТребуемаяДатаОтгрузки=НачалоДня(ТекущаяДата()-24*60*60*ОткатитьНазадНа);
  Иначе
   ТребуемаяДатаОплаты=ЗаполнениеДокументов.ОпределитьДату(НачалоДня(ТекущаяДата()),-ОткатитьНазадНа);
   //ТребуемаяДатаОтгрузки=ЗаполнениеДокументов.ОпределитьДату(НачалоДня(ТекущаяДата()),-ОткатитьНазадНа);
 КонецЕсли;
 Сообщить(ТребуемаяДатаОплаты);
КонецПроцедуры


//КалендарныеДни - функция, разберетесь сами
Функция ПолучитьДень(ИсходнаяДата, КоличествоПрибавляемыхДней)
 
 Запрос = Новый Запрос("
 |ВЫБРАТЬ 
 |ДОБАВИТЬКДАТЕ(&ИсходнаяДата, ДЕНЬ, &Количество) как Дата");

 Запрос.УстановитьПараметр("ИсходнаяДата", ИсходнаяДата); 
 Запрос.УстановитьПараметр("Количество", КоличествоПрибавляемыхДней); 
 Возврат Запрос.Выполнить().Выгрузить()[0].Дата; 
КонецФункции 

понедельник, 22 июня 2015 г.

Все об 1С: Как в 1с 8 Получить список подчиненных документов

Все об 1С: Как в 1с 8 Получить список подчиненных документов:


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