Поиск битых ссылок запросом. Универсальный алгоритм и обработка-пример.

Публикация № 237102

Разработка - Практика программирования

поиск битых ссылок запрос

Каждому специалисту 1С рано или поздно приходится решать задачу поиска битых ссылок в базе с целью их замены или восстановления объектов. Распространенные в сети описания метода поиска битых ссылок запросом оказались далеки от универсальности или содержали ошибки. В этой публикации рассматривается универсальный алгоритм, подходящий для любой таблицы базы данных 1С Предприятия. Приводится пример формирования запроса вручную и автоматически.

 

Обычно, для поиска битых ссылок используется следующий метод. Записи таблицы выбираются программно через метод менеджера объекта или регистра Выбрать() и строковое представление ссылки сравнивается со строкой "Объект не найден". Обход выборки представляет собой порциональное чтение записей из базы, то есть запрос в цикле. Затем еще один запрос на каждой итерации для получения представления. И в случае универсального алгоритма представление нужно получить для каждого ссылочного поля.

Мы рассмотрим другой, более быстрый и универсальный способ - поиск через запрос к БД.

 

Казалось бы, что может быть проще? Мы знаем, что представление битой ссылки содержит "Объект не найден". Достаточно в запросе получать представление ссылки и сравнивать его с этой строкой. Но функция языка запросов ПРЕДСТАВЛЕНИЕ() возвращает поле неограниченной длины и запросе мы не можем сделать такое сравнение. Попытка написать выражение ПОДСТРОКА(ПРЕДСТАВЛЕНИЕ(Ссылка) , 1, 8) также не даст результата. Выполнение запроса прекратится с ошибкой:

Однако у битой ссылки в запросе есть и другое свойство. Ссылка, полученная в запросе от битой ссылки будет NULL. То есть если СсылочноеПоле указывает на несуществующий объект, то СсылочноеПоле.Ссылка - это NULL. Причем Ссылка - это единственное универсальное поле подходящее для такого сравнения. Код, Номер, Наименование и прочие поля могут отствовать у объектов.

Отлично, значит теперь мы можем выбрать битые ссылки? Не совсем. Ведь тем же свойством будут обладать пустые ссылки и более того, значение НЕОПРЕДЕЛЕНО, если поле в таблице базы данных имеет составной тип. То есть нужно проводить не только сравнение СсылочноеПоле.Ссылка есть NULL но и сравнивать СсылочноеПоле с пустыми ссылками допустимых типов и с НЕОПРЕДЕЛЕНО, исключая такие ссылки из результата запроса.


Звучит сложно? Действительно, если таблица содержит поля составного типа и мы будетм писать запрос вручную, то да. Возьмем например запрос для поиска битых ссылок в одном из регистров УПП 1.3. Он написан вручную и даже после выкидывания из него большей части полей выглядит громоздким. Добавление каждого нового поля приводит к появлению еще около десяти строк кода:


ВЫБРАТЬ
   
А.РазделУчета,
   
А.Организация,
   
А.Проект,
   
ВЫБОР
        КОГДА
А.РазделУчета.Ссылка ЕСТЬ NULL
                И
А.РазделУчета <> ЗНАЧЕНИЕ(Перечисление.РазделыУчета.ПустаяСсылка)
           
ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ
КАК РазделУчетаЭтоБитаяСсылка,
   
ВЫБОР
        КОГДА
А.Организация.Ссылка ЕСТЬ NULL
                И
А.Организация <> ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
           
ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ
КАК ОрганизацияЭтоБитаяСсылка,
   
ВЫБОР
        КОГДА
А.Проект.Ссылка ЕСТЬ NULL
                И
А.Проект <> ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка)
               
И А.Проект <> ЗНАЧЕНИЕ(Справочник.ВидыРаспределенияПоПроектам.ПустаяСсылка)
               
И А.Проект <> НЕОПРЕДЕЛЕНО
            ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ
КАК ПроектЭтоБитаяСсылка
ИЗ
   
РегистрСведений.АналитикаВидаУчета КАК А
ГДЕ
    (
А.РазделУчета.Ссылка ЕСТЬ NULL
                И
А.РазделУчета <> ЗНАЧЕНИЕ(Перечисление.РазделыУчета.ПустаяСсылка)
           
ИЛИ А.Организация.Ссылка ЕСТЬ NULL
                И
А.Организация <> ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
           
ИЛИ А.Проект.Ссылка ЕСТЬ NULL
                И
А.Проект <> ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка)
               
И А.Проект <> ЗНАЧЕНИЕ(Справочник.ВидыРаспределенияПоПроектам.ПустаяСсылка)
               
И А.Проект <> НЕОПРЕДЕЛЕНО)

 

Но если присмотреться, то мы увидим, что его формирование сводится к алгоритму всего из двух циклов. Внешнего - по полям таблицы и вложенного - по типам каждого поля. Причем этот алгоритм будет подходить для любой таблицы базы данных. После чего за одно обращение к БД мы получим все битые ссылки из таблицы, а дальше обойдем результат запроса, уже не обращаясь к базе.

 

Алгоритм на языке близком к человеческому звучит так:

1) Перебираем ссылочные поля объекта метаданных и добавляем их в поля запроса.

2) Для каждого добавленного в п.1 поля создаем в запросе еще одно выражение, которое будет принимать значение ИСТИНА, если поле содержит битую ссылку. Это выражение формируется путем перебора доступных для поля типов и сравнения поля с НЕОПРЕДЕЛНО и пустой ссылкой для каждого типа: ЗНАЧЕНИЕ(ТаблицаТипа.ПустаяСсылка).

3) Из базы данных нам нужно выбирать только те записи в которых хотя бы одно поле - это битая ссылка. Поэтому такие же выражения как в п.2 добавляем в блок запроса ГДЕ, объединяя эти выражения оператором ИЛИ.

4) Выполняем запрос и обходя его результат выбираем те значения полей, для которых выражение построенное в п.2 принимает значение ИСТИНА.

 

А вот и реализация алгоритма на языке 1С. Здесь ПолноеИмяТаблицы - это имя таблицы базы данных (например "Документ.АвансовыйОтчет.Товары"), а МД - это метаданные таблицы (объекта, табличной части или регистра):

   

Процедура НайтиСсылкиНаСервере(МД, ПолноеИмяТаблицы)

   
//массив будет содержать структуры с четырмя элементами:
    //1) Поле - имя и псевдоним в запросе ссылочного поля таблицы
    //2) ПолеЭтоБитаяСсылка - псевдоним в запросе поля булевого типа, которое
    //   в результате запроса будет Истина, если Поле содержит битую ссылку
    //3) МассивИменТаблиц - массив, состоящий из полных имен метаданных,
    //   на которые возможны ссылки из поля
    //4) МожетБытьНеопределено - может ли поле быть равно Неопределено
   
МассивОписанийПолей = Новый Массив;
   
ДобавитьОписаниеПолей(МассивОписанийПолей, "Измерения", МД);
   
ДобавитьОписаниеПолей(МассивОписанийПолей, "Ресурсы", МД);
   
ДобавитьОписаниеПолей(МассивОписанийПолей, "Реквизиты", МД);
   
ДобавитьОписаниеПолей(МассивОписанийПолей, "РеквизитыАдресации", МД);

    Если
МассивОписанийПолей.Количество() = 0 Тогда
        Возврат;
//ссылочных полей нет
   
КонецЕсли;

   
//Теперь у нас есть ссылочные поля таблицы и имена таблиц, ссылки на которые
    //они могут содержать можно переходить к конструированию запроса
   
БлокСсылочныхПолей = "";
   
БлокБулевыхПолей = "";
   
БлокУсловия = "";
   
ПС = Символы.ПС;
   
ТАБ = Символы.Таб;
   
ТАБ3 = ТАБ+ТАБ+ТАБ;

   
МаксИндексМассиваОписаний = МассивОписанийПолей.Количество() - 1;
    Для
К = 0 По МаксИндексМассиваОписаний Цикл

       
ОписаниеПоля = МассивОписанийПолей[К];
       
БулевоВыражение = "ВЫБОР КОГДА " + ПС+ТАБ3+
                ?(
ОписаниеПоля.МожетБытьНеопределено, ОписаниеПоля.Поле + " <> НЕОПРЕДЕЛЕНО И ", "");

        Для Каждого
ИмяТаблицы Из ОписаниеПоля.МассивИменТаблиц Цикл
           
БулевоВыражение = БулевоВыражение + ОписаниеПоля.Поле
                                + " <> ЗНАЧЕНИЕ("+ИмяТаблицы+".ПустаяСсылка) И ";
        КонецЦикла;

       
БулевоВыражение = БулевоВыражение+ОписаниеПоля.Поле+".Ссылка ЕСТЬ NULL"
                           
+ПС+ТАБ3+"ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ";
       
БлокСсылочныхПолей = БлокСсылочныхПолей + ТАБ + ОписаниеПоля.Поле;
       
БлокБулевыхПолей = БлокБулевыхПолей + ТАБ + БулевоВыражение + " КАК "+ОписаниеПоля.ПолеЭтоБитаяСсылка;
       
БлокУсловия = БлокУсловия + ТАБ + БулевоВыражение;

        Если
К <> МаксИндексМассиваОписаний Тогда //дальше будут еще поля
           
БлокСсылочныхПолей = БлокСсылочныхПолей + ","+ПС;
           
БлокБулевыхПолей = БлокБулевыхПолей + "," + ПС;
           
БлокУсловия = БлокУсловия + " ИЛИ " + ПС;
        КонецЕсли;

    КонецЦикла;

   
//СОБИРАЕМ ТЕКСТ, ДОБАВЛЯЕМ ТАБЫ И ПЕРЕНОСЫ ЧТОБЫ БЫЛО КРАСИВО
   
ТекстЗапроса "ВЫБРАТЬ" +ПС+ПС+ БлокСсылочныхПолей + ","+ПС+БлокБулевыхПолей+
                   
ПС+ПС+"ИЗ " + ПолноеИмяТаблицы+
                   
ПС+ПС+"ГДЕ"+ПС+ПС+ БлокУсловия;

   
Запрос = Новый Запрос(ТекстЗапроса);
   
Выборка = Запрос.Выполнить().Выбрать();

   
//Обходим записи с битыми ссылками и по булевым полям смотрим, какие именно поля содержат битые ссылки
   
Пока Выборка.Следующий() Цикл
        Для Каждого
ОписаниеПоля Из МассивОписанийПолей Цикл
            Если
Выборка[ОписаниеПоля.ПолеЭтоБитаяСсылка] Тогда //ИСТИНА, значит ссылка битая

               
БитаяСсылка = Выборка[ОписаниеПоля.Поле];
               
Сообщить(БитаяСсылка); //ГОТОВО!!! ЗДЕСЬ ЧТО-ТО ДЕЛАЕМ С БИТОЙ ССЫЛКОЙ

           
КонецЕсли;
        КонецЦикла;
    КонецЦикла;

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


//ВСПОМОГАТЕЛЬНЫЙ МЕТОД ДЛЯ ПОЛУЧЕНИЯ ОПИСАНИЯ ПОЛЕЙ ИЗ МЕТАДАННЫХ
Процедура ДобавитьОписаниеПолей(МассивОписанийПолей, ТипПолей, МД)
    Попытка
       
Поля = МД[ТипПолей];
    Исключение  
//если возникло исключение значит у этой таблицы
       
Возврат; //нет такого типа полей и нам не нужно их обходить
   
КонецПопытки;

    Для Каждого
Поле Из Поля Цикл
       
ТипыПоля = Поле.Тип.Типы();
       
МассивПолныхИменМетаданных = Новый Массив;

        Для Каждого
Тип Из ТипыПоля Цикл
           
МетаданныеТипа = Метаданные.НайтиПоТипу(Тип);
            Если
МетаданныеТипа <> Неопределено Тогда
               
МассивПолныхИменМетаданных.Добавить(МетаданныеТипа.ПолноеИмя());
            КонецЕсли;
        КонецЦикла;

        Если
МассивПолныхИменМетаданных.Количество() > 0 Тогда //Тип поля допускает хранение в нем ссылок
           
МассивОписанийПолей.Добавить(Новый Структура(
               
"Поле, ПолеЭтоБитаяСсылка, МассивИменТаблиц, МожетБытьНеопределено",
               
Поле.Имя, Поле.Имя + "ЭтоБитаяСсылка", МассивПолныхИменМетаданных, ТипыПоля.Количество()>1));
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

   

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

Далее эти ссылки можно выгружать в файл для поиска объектов в архивной копии базы или создавать для них новые объекты. Но это уже совсем другая история :)

 

  

 

Если вам показалась интересной эта информация, то не пропустите также следующие публикации:

Динамические подписки на события

Универсальный динамический список с возможностью отбора по реквизитам табличных частей

 

 

Скачать файлы

Наименование Файл Версия Размер
ПоискБитыхСсылокВЗаданнойТаблице.epf

.epf 11,04Kb
17.11.13
299
.epf 11,04Kb 299 Скачать

Специальные предложения

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. B2B 264 17.11.13 21:36 Сейчас в теме
(0) Как ваш запрос дружит с RLS? Какова будет реакция, если в запрос попадет объект не доступный из-за RLS?
3. Vladimir Litvinenko 18.11.13 02:20 Сейчас в теме
(2) B2B,
Цель публикации - описать алгоритм и предоставить обработку-шаблон, которую можно менять под свои нужды.

Если так получилось, что поиском битых ссылок и восстановлением объектов для них у вас занимается пользователь с ограниченными правами, то нужно изменить код в зависимости от ситуации. Либо добавить в начало метода НайтиСсылкиНаСервере вызов УстановитьПривилегированныйРежим, либо добавить в запрос слово РАЗРЕШЕННЫЕ.

Также результат запроса будет содержать данные всех записей таблицы, в которых обнаружены битые ссылки. Если цель - именно восстановление объектов, то нужно обеспечить уникальность ссылок - выгружать битые ссылки в таблицу значений и сворачивать таблицу по ним, либо модифицировать запрос c этой целью. Это уже вам решать.
11. wunderland 200 18.11.13 19:27 Сейчас в теме
(2) B2B, Битые ссылки, обычно, интересуют тех, на кого RLS не распространяются :)
4. yuraos 967 18.11.13 06:08 Сейчас в теме
Ценю фундаментальность!
Особенно глобальную!!!
---
Вот еще один способ, не такой глобально-фундаментальный,
но тоже универсальный
Как узнать, является значение ссылочного типа «битой ссылкой» или нет?
5. Makushimo 156 18.11.13 06:45 Сейчас в теме
Нужно ли добавлять номер строки, где есть битая ссылка, в случае перебора табличной части объекта?
6. Vladimir Litvinenko 18.11.13 09:04 Сейчас в теме
(5) Makushimo,
Нужно ли добавлять номер строки, где есть битая ссылка, в случае перебора табличной части объекта

Это имеет смысл, если вы хотите делать замену битой ссылки на другую или просто увидеть глазами, где именно она была использована.

В этом случае необходимо также выбирать все поля, которые составляют ключ таблицы БД. Для объекта - это Ссылка, для табличной части Ссылка+НомерСтроки, для независимых регистров - комбинация их измерений и т.д.

Хотя замена ссылки или поиск объектов, где она была использована, обычно производятся глобально и для этого используются другие методы.
7. TheGrr 140 18.11.13 12:07 Сейчас в теме
Чтобы не делать трехэтажные выборки можно получить представление полей со ссылочным типом и выгрузить в ТЗ. Затем эту таблицу значений поместить во временную таблицу и вторым запросом выбрать с условием ПОДОБНО "%<Объект не найден>%".
9. Vladimir Litvinenko 18.11.13 17:26 Сейчас в теме
(7) TheGrr,
Чтобы не делать трехэтажные выборки можно получить представление полей со ссылочным типом и выгрузить в ТЗ. Затем эту таблицу значений поместить во временную таблицу и вторым запросом выбрать с условием ПОДОБНО "%<Объект не найден>%".

Ого! Или я неправильно понял, или Вы предлагаете прочитать всю таблицу и не фильтруя записи передать ее из SQL в 1С. Затем передать обратно из 1С в SQL в качестве параметра. Создать из нее временную таблицу и поместить в нее все эти данные, раздувая tempdb. Затем еще раз пробежаться по ней оператором ПОДОБНО и передать результат из SQL в 1С. Это точно оптимальный алгоритм? :)
10. TheGrr 140 18.11.13 17:33 Сейчас в теме
(9) а я не говорил, что алгоритм оптимальнее. Я говорил, что выборка будет читабельнее :D
30. sanek_gk 100 28.11.13 12:52 Сейчас в теме
(10) TheGrr, насколько она будет читабельнее в базе 150 ГБ и более ещё неизвестно, особо когда обработка будет выполняться неопределённо долгое время и потребует неопределенное количество ресурсов для выполнения алгоритма (очень похожего на китайский)
8. the1 585 18.11.13 16:25 Сейчас в теме
Не хватает колонки "Ссылка", чтобы оперативно увидеть в каком документе/справочнике обнаружена битая ссылка. А так да, заслуженный плюс
12. peterxx 19 19.11.13 10:24 Сейчас в теме
Хороший алгоритм. Плюс без разговоров.
13. CaSH_2004 361 19.11.13 17:45 Сейчас в теме
(0) Даже глянув наискосок видно что написано супер, уважаю такой подход, да и тема актуальная
14. seermak 662 20.11.13 04:17 Сейчас в теме
(0) есть несколько пожеланий: 1. в выборку попадают не только ссылочные объекты, но и простые(типа Число, Дата и т.д.)-это плохо 2. "Не царское это дело" выбирать 3х этажную конструкцию сначала Справочник.Класс, Справочник.Объект,Справочник.Таблица - проще выбрать класс и прогнать по всему классу, а потом уже копаться в отдельно взятом (в табличную часть обработки добавить ссылку на объект)
16. 7OH 32 20.11.13 11:05 Сейчас в теме
Претензия на универсальность была бы уместна, если бы был список метаданных (документы, справочники, регистры), в которых искать с галочками.
А искать по каждой таблице отдельно, тем более в УПП - шутка ли ?
17. Vladimir Litvinenko 20.11.13 11:21 Сейчас в теме
(16) 7OH,
Да без проблем. Подкорректировал заголовок. Слово "универсальность" относилось к алгоритму, поскольку он применим для любой таблицы базы данных. Обработка - просто пример его реализации (см. комментарий №3)
18. romansun 191 20.11.13 21:29 Сейчас в теме
выбрать *
из справочник.контрагенты
где ссылка не в (выбрать ссылка
из справочник.контрагенты)
19. Жолтокнижниг 250 25.11.13 16:26 Сейчас в теме
Столько восхищений удивлений, а Битые ссылки. Поиск, удаление, восстановление. разве никто не видел?
Vladimir Litvinenko; +1 Ответить
22. webester 32 28.11.13 04:23 Сейчас в теме
(19)Потому что здесь запрос?
23. Vladimir Litvinenko 28.11.13 05:32 Сейчас в теме
(22) webester,
Желтокнижник привел ссылку на очень хорошую универсальную обработку и в ней битые ссылки ищутся похожим методом. Но там не описан сам алгоритм и если спросить Яндекс или Гугл про поиск битых ссылок запросом, то на эту обработку вы не выйдите. Не вышел и я, поэтому и появилась эта публикация.
24. Жолтокнижниг 250 28.11.13 09:24 Сейчас в теме
(22) webester, он и там(запрос), причем как мне помниться алгоритм точно такой же.
25. webester 32 28.11.13 09:43 Сейчас в теме
(24)ок, замечательная действительно обработка, зато здесь код сразу в статье, можно не тратить $m (если это для кого то критично), а самому собрать велосипед. По моему тоже имеет право на жизнь.
(23)либо у нас с вами гугл разный, либо вы им пользоваться не умеете, третья сверху ссылка.
26. Жолтокнижниг 250 28.11.13 09:54 Сейчас в теме
(25) webester, у кого нет $m таких велосипедов насобирают.
27. webester 32 28.11.13 09:58 Сейчас в теме
(26)В целом согласен, но у человека может просто не быть здесь аккаунта. Как например у моих коллег, почему то не считают нужным, почему не знаю.
28. Vladimir Litvinenko 28.11.13 10:21 Сейчас в теме
(25) webester, Вы прям напугали картинкой. Думал инфостарт глючит :) По такому запросу будут десятки результатов. Вы забыли добавить одно ключевое слово к запросу :)
29. webester 32 28.11.13 10:40 Сейчас в теме
(28) я сначала посмотрел бы все варианты, а потом начал сужать круг. Но это же неважно по вашему запросу, все тоже отлично находится
20. yurets86 26.11.13 01:48 Сейчас в теме
а разве силами самого конфигуратора не можно тоже самое сделать? я с 1с-кой только знакомлюсь и как раз только вчера вылавливал битые ссылки, и с помощью конфигуратора - отлично все получается
21. webester 32 28.11.13 04:20 Сейчас в теме
(20)Вы имеете ввиду ТиИ? Это не тоже самое :) У меня в базе очень часто бывает, что нет ссылок ибо РИБ и ходят не все объекты, ТиИ натворит такой бардак, что страшно подумать. Поэтому иногда удобнее бить прицельно. То есть я знаю, где ссылка реально битая, а где она заменится объектом после обмена. Еще это имеет смысл, для перерегистрации объектов. То есть в этой базе они битые, зато в другой базе живые, если это РИБ просто перезаписал найденные ссылки в другой базе, если бэкап, выгрузил и загрузил в боевую. И как бы не всегда надо их исправлять, иногда к примеру их надо просто исключить из обработки.
31. sanek_gk 100 28.11.13 13:01 Сейчас в теме
От себя добавлю, Афтор исправь алгоритм в обработке, будет работать неправильно при следующих условиях:
Проверяемое поле Имеет составной тип: несколько ссылочных, и один или более простых. По текущему алгоритму проверяется значение ссылки на null (наличие самой ссылки) но если там указан простой тип то её и не будет и не должно быть - однако такое значение успешно пройдёт проверку и вывалится в итоге как битая ссылка чем она в принципе не является.
32. isn 15 13.07.15 12:49 Сейчас в теме
Хотелось бы вариант обработки для обычного приложения а не только для управляемых форм.
33. ZhokhovM 406 03.10.16 17:08 Сейчас в теме
Вопрос по управляемой форме, может ли эта обработка найти битые ссылка в отчетах? Например, в отборе характеристики в отчете аптеки стоит "<Объект не найден> (480:aee70015e9b8c48d11e01fecb9c33de3)".
34. docerman 51 03.04.18 15:50 Сейчас в теме
А где-же в результате сами объекты в которых есть битые ссылки?
36. fieryfist 15 31.10.18 22:51 Сейчас в теме
(34)Сами объекты можно найти например обработкой Универсальный подбор и обработка объектов (через поиск ссылок на объект). Знаю, что битую ссылку не добавить для поиска, но немного доработав обработку, это можно сделать.
35. EvgenURNN 96 22.05.18 14:20 Сейчас в теме
Такой алгоритм не будет работать на большой базе, где есть реквизит типа "Любая ссылка" и много-много разных ссылочных таблиц. Придется:
1. разбивать на подзапросы
2. делать явное левое соединение либо ВЫРАЗИТЬ
fieryfist; +1 Ответить
Оставьте свое сообщение

См. также

Вам нравятся запросы в 1С? Промо

Практика программирования Разработка v8 v8::Запросы 1cv8.cf Абонемент ($m)

Речь не только о том, что простейший запрос с "легальным" оформлением растянется на пол-экрана, речь еще обо всем, что нужно написать "в нагрузку" к тексту запроса. Все эти "Новый Запрос", "УстановитьПараметр" и последующие пляски с обработкой результата... Пора с этим заканчивать!

1 стартмани

03.07.2019    18620    4    m-rv    86    

Конвейер проверки качества кода

Инструментарий разработчика Практика программирования Математика и алгоритмы v8 1cv8.cf Абонемент ($m)

Jenkinsfile для выполнения проверки качества кода. Собирает информацию с АПК, EDT и BSL-LS. Сопоставляет ошибки с гит-репозиторием, выгруженным ГитКонвертором. Отправляет в Сонар.

3 стартмани

04.09.2019    22135    21    Stepa86    44    

Работа с публикациями "Инфостарт"

Практика программирования О сообществе WEB v8 УУ Абонемент ($m)

Работа с рублевыми публикациями на сайте "Инфостарт": ведение клиентов, заказов, обновление файлов публикации, рассылка обновлений.

1 стартмани

13.09.2018    20221    13    RocKeR_13    16    

HTTP Сервисы: Путь к своему сервису. Часть 3

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

Продолжение статьи «HTTP Сервисы: Путь к своему сервису. Часть 2». В предыдущих частях мы использовали только Get, в этой части поговорим о других методах и длительных операциях.

1 стартмани

27.08.2018    32988    51    dsdred    15    

[x1c.ru] 1CDBin: Работа с файлами *.1CD на низком уровне средствами языка 1С с возможностью чтения таблиц (поддерживается формат 8.3.8.0) Промо

Тестирование и исправление Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Обработка позволяет просматривать файловые базы 1CD на низком уровне средствами встроенного языка. Реализована часть функциональности Tool_1CD, но на языке 1С Предприятия. Показываются таблицы, параметры таблиц, поля таблиц, записи таблиц, значения полей BLOB, есть 16-ричный просмотр страниц базы и консоль кода. Можно использовать для изучения структуры файлов 1CD, просмотра баз 1CD для выявления повреждений, создания своих обработок для выгрузки данных без открытия исследуемой базы в 1С:Предприятии.

1 стартмани

07.10.2014    50829    205    GusevNA    75    

Позиционирование в помещении с помощью нейросети по сигналу Wi-Fi. Интерактивная карта склада в 1С с показом позиции

Инструментарий разработчика Практика программирования v8 Абонемент ($m)

Данная публикация содержит в себе редактор и интерактивную карту склада или иного помещения, на которой в реальном времени отображается позиция устройства, координаты которого вычисляются по уровням сигнала нескольких роутеров Wi-Fi. В статье и приложенным к ней разработкам предлагаются инструменты и методика для реализации вычисления точной геопозиции внутри помещений с помощью нейронной сети. Конфигурация написана на релизе 1С:Предприятие 8.3.12.1412, клиентское приложение имеет минимальный уровень совместимости SDK -16.

5 стартмани

09.08.2018    26252    26    informa1555    26    

Работа с данными выбора

Практика программирования Работа с интерфейсом v8 Россия Абонемент ($m)

В управляемом интерфейсе заложена мощная возможность описывать связи реквизитов формы через параметры. Установка параметров связей позволяет ограничить выбор данных так, чтобы целостность данных была обеспечена на этапе ввода. Однако без дополнительного программирования задать можно только самые простые связи. Такие условия связи, как зависимость от реквизита через точку или зависимость через дополнительное отношение, заданное в регистре сведений - уже задать без программирования не получится.

1 стартмани

17.07.2018    42318    17    kalyaka    16    

Полезные примеры составления схемы компоновки данных #2

Практика программирования v8 v8::СКД 1cv8.cf Абонемент ($m)

Еще один набор примеров как решить частные задачи в СКД

1 стартмани

22.05.2018    28411    11    SITR-utyos    13    

ВСТАВИТЬ В Справочник.Номенклатура (Код, Наименование) ЗНАЧЕНИЯ ("001", "Новый товар") Промо

Практика программирования v8 v8::Запросы 1cv8.cf Абонемент ($m)

Вас не обманывают ваши глаза, это запрос на изменение данных! И это работает без прямого доступа к БД, регистрации и смс.

1 стартмани

01.06.2018    28906    86    m-rv    57    

Заполняем по шаблону (по умолчанию)

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

Простой в подключении, универсальный и достаточно удобный механизм заполнения реквизитов произвольных документов/справочников значениями по умолчанию. Реализован в расширении, но может быть и непосредственно включен практически в любую конфигурацию на управляемых формах простым копированием одной формы и двух команд. Весь код в статье.

1 стартмани

08.02.2018    26648    19    mvxyz    17    

Печатная форма, сделанная как расширение конфигурации для БП 3.0. Новые возможности БСП

Практика программирования Универсальные печатные формы v8 БП3.0 Абонемент ($m)

Печатные формы на внешних обработках скоро канут в лету. На смену им приходят ПФ, реализованные в виде расширений конфигурации. Не нашел на сайте примеров таких расширений. Привожу пример подобного расширения для БП 3.0.

1 стартмани

06.12.2017    25554    49    kwazi    6    

Паузы при исполнении кода (Sleep для 1С)

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

Решил проверить все найденные варианты паузы для 1С. В результате получилась обработка для тестирования и небольшая статья с итогом.

1 стартмани

28.11.2017    40190    11    swimdog    41    

Нечеткий поиск одним запросом Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

Использование механизма полнотекстового поиска в 1С не всегда оправдано, т.к. построение индекса и поддержание его в актуальном состоянии может значительно нагружать систему. Предлагаемая реализация нечеткого поиска методом N-грамм выполняется одним запросом, что позволяет производить поиск в любой таблице и не требует предварительного построения индекса.

1 стартмани

28.12.2015    26055    67    vasvl123    9    

Telegram-боты

Практика программирования v8 Абонемент ($m)

Описание теории, разбор архитектуры и пример реализации telegram-ботов. Сразу скажу, со структурированием изложения мало что могу поделать. :) редакция от 18.07.2018 Правки последней редакции выделены жирным.

1 стартмани

01.09.2017    30183    128    PLAstic    54    

Умный дом на 1С + ардуино

Практика программирования v8 Абонемент ($m)

Конфигурация для автоматизации быта программиста 1C и не только. В данной статье будет рассказано, как можно использовать 1С для задач, не входящих в стандартные рамки этой платформы. Например, управление домом. В качестве периферии для подключения будет использован микроконтроллер (МК) Ардуино, но на нём не будет никакой логической нагрузки, весь процесс будет проходить на сервере 1С. Работа с пинами ввода/вывода происходит напрямую из 1С.

1 стартмани

07.08.2017    21273    20    sasha777666    63    

Расширения конфигураций 1С: учимся перехватывать методы

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

В этой статье я на примерах разберу некоторые механизмы расширений конфигураций 1С. А именно «перехваты» методов модуля объекта и «перехваты» событий формы и элементов формы. Данная статья написана с учебными целями, чтобы показать, как при помощи расширений конфигурации можно делать такие доработки, ради которых раньше приходилось снимать конфигурацию с поддержки.

1 стартмани

30.05.2017    120447    13    signum2009    46    

Быстрое определение интервалов в запросе Промо

Практика программирования v8 Абонемент ($m)

В статье описывается новый метод определения интервалов между данными различных записей в запросе. В отличие от общеизвестного метода, время работы предлагаемого метода зависит от объема данных ЛИНЕЙНО. Это обеспечивает ему значительный выигрыш по быстродействию на больших объемах данных. В качестве иллюстрации возможностей метода приведен отчет, показывающий гистограмму распределения времени между продажами.

1 стартмани

01.10.2015    49418    35    ildarovich    41    

Регулярные выражения – это просто. Построитель и отладчик регулярных выражений

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

Предлагается к использованию построитель регулярных выражений. Выполненный в виде внешней обработки, он позволит строить сложно-структурированные выражения на основе параметрического описания, тестировать их, и в результате получить программный код 1С.

1 стартмани

13.03.2017    29679    112    romasna    49    

Распознавание текста с помощью нейросетей Google Cloud Vision и 1С

Практика программирования v8 1cv8.cf Абонемент ($m)

Возможности Google Cloud Vision в распознавании текста.

1 стартмани

08.02.2017    26621    120    kiv1c    18    

Графическая схема. Управление при помощи XDTO.

Практика программирования v8 Абонемент ($m)

В статье описывается методика программного управления элементами графической схемы при помощи механизма XDTO. Приложена готовая к использованию библиотека функций для создания и удаления графических объектов, а также для связи элементов схемы соединительными линиями.

2 стартмани

16.01.2017    20384    100    Alxby    21    

Восстановление битой ссылки на раз-два Промо

Тестирование и исправление v8 1cv8.cf Абонемент ($m)

Простой способ восстановить битую ссылку типа " (20:94b81c6f65428d5911e2a8bebc48d793)".

1 стартмани

26.04.2013    31862    218    Vin_Tik    36    

Работа с двоичными данными на примере чтения файлов изображений. Новые возможности 8.3.9

Практика программирования WEB v8 1cv8.cf Россия Абонемент ($m)

В статье приводятся новые функции по работе с двоичными данными, появившимися в версии платформы 8.3.9 , на примере анализа формата и размера изображений. А также пример отправки изображения через API ВКонтакте с помощью новых объектов (без использования ОбъединитьФайлы())

1 стартмани

14.11.2016    23766    16    Anton64    22    

Несколько шаблонов для доработки типовых конфигураций

Практика программирования Инструментарий разработчика v8 v8::УФ Абонемент ($m)

Предлагаю несколько каркасов для создания новых объектов в типовых конфигурациях. Это выжимка из кода нескольких конфигураций, которая позволит быстро и красиво создавать и дорабатывать объекты метаданных с соблюдением идеологии исходной системы

1 стартмани

03.10.2016    35083    95    json    25    

HTTP-сервис: отчеты [Расширение]

Практика программирования Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

Это HTTP-сервис, который возвращает почти любой отчет в HTML, XLSX или в JSON. Сохраните вариант отчета, получите на него ссылку и можно получить данные без захода в 1С. Работает в конфигурациях на основе БСП 2.3.3+, для отчетов на СКД и в 1С 8.3.8+

2 стартмани

30.08.2016    24918    132    Stepa86    15    

1С: Предприятие + корпоративный чат, как наладить оперативные уведомления за 10 минут

Практика программирования v8 Абонемент ($m)

Как сделать автоматические уведомления о разных событиях из 1С в корпоративный чат MyChat для сотрудников компании

1 стартмани

14.08.2016    46327    36    Demanoidos    60    

Лекарство на случай, если перестала работать форма списка для сделок. (ERP).

Тестирование и исправление v8 ERP2 Абонемент ($m)

Форма списка справочник сделки стала выпадать с ошибкой?  Или все еще в порядке, но хочется спокойно съездить в отпуск, без паники, что менеджеры устроят бунт.

1 стартмани

28.07.2016    21397    0    milkers    2    

Недокументированное использование стандартных форм Upd.

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

Вам не хватает возможностей в платформе 1С или у Вас нет времени на углубленное изучение платформы 1С? Рассмотрены возможности использования стандартных форм, вызываемых из платформы.

1 стартмани

26.07.2016    26545    75    ZhokhovM    60    

Хранение файлов в томах на диске (для УПП 1.3)

Практика программирования v8 УПП1 Абонемент ($m)

Доработка типовой УПП 1.3 в плане хранения присоединенных файлов вне базы данных

2 стартмани

05.06.2016    54509    7    wowik    32    

БСП 2.3 и БСП 3.0: Просто про выполнение внешней обработки в фоне (c индикацией прогресса выполнения)

Инструментарий разработчика Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

Простое пояснение о том, как сделать внешнюю обработку с фоновым выполнением и индикацией процесса для любой конфигурации на основе БСП 2.3.2. UPDATE 20/09/19: добавлен вариант обработки с индикацией процента выполнения и статусом выполнения для БСП 3.0.

1 стартмани

18.05.2016    58065    167    rozer    64    

Остатки на каждый день в запросе

Практика программирования Учет ТМЦ Учет ТМЦ v8 1cv8.cf УУ Абонемент ($m)

Запрос формирует остатки товаров на каждый день в пределах выбранного периода.

1 стартмани

26.04.2016    53945    19    arakelyan    18    

Еще один способ расчета остатков на каждый день в запросе

Математика и алгоритмы Практика программирования v8 Абонемент ($m)

Предлагается новый способ расчета остатков на каждый день (час, минуту, секунду) в запросе. Способ не требует предварительного формирования таблицы дат и также подходит для расчета курсов валют, цен номенклатуры и других периодических сведений на каждую дату периода. На больших объемах данных предлагаемый способ может превосходить по быстродействию ранее известные методы из-за линейной (в лучшем случае) зависимости трудоемкости от длины периода.

1 стартмани

24.04.2016    32887    48    ildarovich    23    

Выполнение JavaScript кода из 1С в объекте Поле HTML Документа (HTML 5) и вызов события в 1С ПриНажатии

Практика программирования v8 1cv8.cf Россия Абонемент ($m)

Пример выполнения JS кода из 1С в Поле HTML Документа под управляемыми формами, с удобным получением результата в 1С(С помощью вызова привязанного события ПриНажатии к элементу ПолеHTMLДокумента)

1 стартмани

22.03.2016    76573    152    igo1    53    

Количество дней недели (понедельников/вторников/...) в заданном диапазоне одним запросом

Практика программирования v8 Абонемент ($m)

При реализации периодического авто-заполнения маршрутных листов по графику (недельному) необходимо было просчитать стоимость всего периода, с условием выездов только по определенным дням. Заморачиваться с обходом результата не хотелось. Пришлось написать "Небольшой" запрос.

1 стартмани

03.03.2016    17045    1    Alexander.Shvets    5    

Простые радости жизни программиста 1С: выбор типа значения

Работа с интерфейсом Практика программирования v8 1cv8.cf Абонемент ($m)

Предлагаемая в работе обработка включает обычную и управляемую формы, которые максимально точно реализуют функциональность системного диалога выбора типа в толстом клиенте обычное приложение (включая оформление диалога). Эти формы имеют дополнительные интерфейсные удобства и могут быть использованы в качестве альтернативных диалогов выбора типа.

1 стартмани

17.02.2016    47599    50    yuraos    17    

Отображение прогресса выполнения длительных операций в БСП и их отладка в текущем сеансе.

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

В статье описан способ исполнения длительных операций в конфигурациях, в которых используется библиотека стандартных подсистем, с визуализацией прогресса исполнения и отображения хода обработки данных. Также дается краткое описание процесса отладки длительных операций в текущем сеансе.

1 стартмани

17.02.2016    51356    166    balanton    23    

Яндекс.Деньги "Благотворительность"

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

Яндекс.Деньги теперь в 1С. Форма для приема благотворительных взносов. Форму легко сделать и вставить на любую страницу сайта или блога. Платежи будут приходить на ваш кошелек. На форме есть три способа платежа: из кошелька, с банковской карты, с баланса мобильного.

1 стартмани

16.02.2016    22044    8    Tatitutu    5    

Мастер рассылки e-mail 2.2 для управляемых форм

Практика программирования Email v8 v8::УФ ERP2 БП3.0 УТ11 Абонемент ($m)

Для пользователей: переделанный из старый разработки под 8.2 с использованием библиотеки Мастер рассылки e-mail 2.2 (ERP, УТ, БП) (Только управляемые формы), который теперь может запускаться под любой версией платформы с разрешенными или запрещенными модальными/синхронными вызовами в конфигурации. Также удобный выбор e-mail и их владельцев с помощью отбора динамического списка по любым критериям и галочки исключения.

1 стартмани

29.12.2015    35871    19    milkers    4    

Передача больших пакетов через веб-сервисы

Практика программирования Администрирование данных 1С Внешние источники данных v8 Абонемент ($m)

Реализация механизма передачи больших пакетов через веб-сервисы. С его помощью передать файл размером в несколько гигабайт не составит проблем.

1 стартмани

06.12.2015    54294    47    YPermitin    19    

Пример связи 1С и мессенджера Telegram. Получение данных из 1С запросом из Telegram

Практика программирования Внешние источники данных v8 1cv8.cf Абонемент ($m)

В результате чтения публикации Вы получите готовую внешнюю обработку, позволяющую получать из 1С данные, запрашиваемые через Telegram. В данной статье рассмотрим следующее: Использование HTTPСоединение; Чтение JSON для версии 1С 8.3.6 и выше, а также аналог JSON для версии 1С ниже 8.3.6; Подключение обработчика ожидания; Некоторые основные возможности API Telegram; Как создать бота для Telegram; Программное создание колонок дерева на управляемой форме;

1 стартмани

19.11.2015    87610    446    Luchik    202    

Полезные приемы при работе с Excel из 1С (Версия 3.1)

Практика программирования Разработка внешних компонент Загрузка и выгрузка в Excel v8 1cv8.cf Абонемент ($m)

Программисту 1С часто приходится работать с таблицами Excel из 1С. Я постарался собрать небольшой FAQ и набор функций для работы с файлами Excel. Надеюсь, кому-то будет полезна данная статья.

1 стартмани

22.09.2015    185138    432    Zerocl    65    

Javascript и 1С. Кросс-платформенное взаимодействие

Практика программирования v8 1cv8.cf Абонемент ($m)

Что делать, если необходим богатый интерфейс, а управляемые формы нам его не могут обеспечить? Использовать HTML и JavaScript. В статье рассмотрено взаимодействие кода 1С и JavaScript, работающее на любой платформе: толстый, тонкий и веб-клиент, под Windows и Linux.

1 стартмани

14.09.2015    63965    200    VitaliyCeban    59    

Code First и Linq to EF на примере 1С версии 7.7 и 8.3 часть I

Практика программирования v8 Абонемент ($m)

Данный проект является чисто исследовательским примером использования Code First и Linq to EF на примере 1С версии 7.7. Так как сам я программист 1С, то мне всегда было интересно, как можно перенести модель объектов 1С на компилируемые языки, и использовать мощь Linq to EF. С появлением Code First давно хотел прикрутить, но все как-то руки не доходили, и вот, наконец ..

1 стартмани

28.08.2015    21909    3    Serginio    2