О технологии «искусственный интеллект»
В настоящее время трудно найти человека, который прямо или косвенно не сталкивался бы с технологией искусственного интеллекта. Порой складывается впечатление, что повсеместные разговоры на тему ИИ превратились в очередной бесконечный спор, в котором участники громко доказывают свою правоту, лишая себя способности слышать аргументы другой стороны. Еще один деструктивный фактор, разъединяющий людей.
Технологию можно представлять себе как инструмент, призванный улучшить результаты деятельности. Для его изготовления нужны ресурсы, порой масштабные. Готовый инструмент используется в определенной сфере деятельности, причем есть области, где его применение нерационально или невозможно. Использование инструмента в адекватной ему области может дать определенные результаты.
Конструктивно будет отвлечься от факторов, необходимых для реализации технологии, и сосредоточиться на том, что, при данных ресурсах в соответствующей области может дать такая технология как «искусственный интеллект», которая в настоящее время реализована как узкий искусственный интеллект?
Можно представлять себе ИИ как логическую машину поиска, которая на входе получает безбрежный океан исходных текстов, созданных на данный момент человеком. Проведя предварительную работу, называемую «обучением», эта машина тщательно анализирует входящие тексты и распознает их вероятностные связи и закономерности. Получив запрос на естественном языке, на основе выявленных закономерностей в огромной неструктурированной базе текстов за разумное время находит релевантные данные, применяет к ним процедуру логического вывода, формирует ответ на запрос − другой текст, которые логически следует или аналогичен по синтаксической структуре какому-то исходному.
Отвечая за запрос пользователя, агент искусственного интеллекта формирует текст, который или написан был раньше, или логически следует из того, что написано раньше или формально грамотно написан, но не несет никакого смысла.
1С:Напарник для разработки
Компанией 1С предлагается к использованию умный помощник для разработчика, использующий современный ИИ для ускорения написания кода и создания прикладных решений. Функциональностью такого помощника, названного «1С:Напарник для разработки» можно воспользоваться, подключив его как сервис в среде разработки 1С:EDT или задавая помощнику вопросы в чате на портале 1С. Среди заявленных возможностей этого инструмента указана помощь в написании кода по стандартам, а именно генерация кода по запросу с автоматическим его документированием, анализ кода на предмет ошибок и соответствия его рекомендациям, модификация, оптимизация кода. Предполагается, что такая помощь может быть востребована программистами с различным опытом.
По функционалу помощника как сервиса в среде разработки 1С:EDT есть информация – видео уроки по базовым приемам работы с помощником, по которым можно сформировать представление о возможностях сервиса. В данной работе предпринята попытка рассмотреть возможности использования чата портала 1С в случае, когда используется не среда 1С:EDT, а классический вариант разработки с использованием конфигуратора.
Услышав о таком инструменте от 1С, использующим технологию искусственного интеллекта, естественно, возникают ожидания по поводу его возможностей с учетом общих соображений о возможностях технологии ИИ. Разработка в 1С – это прежде всего программирование на встроенном языке в среде разработки, имеющей историю и широкий накопленный опыт решений, рекомендованный регламент разработки. Поэтому есть ожидания, что помощник погружен в контекст сложившихся на данный момент способов и приемов программирования как такового, так и с учетом специфики 1С разработки, которые можно показать и порекомендовать программистам.
Возможности генерации кода по классическим запросам
На запросы по написанию кода, реализующего классические учебные задачи по программированию, помощник дает развернутые правильные ответы, в которых приводятся различные варианты решения и дается оценка эффективности этих вариантов. Помощник в контексте понятий математики и информатики, которые используются при написании кода на запросы. Так, например, на запросы о реализации процедур по вычислению чисел Фибоначчи, ключевых понятий комбинаторики, сортировки массивов чисел различными методами, поиск в структурах можно получить полные правильные ответы. Например,
Запрос 1
Пользователь:
> Дан массив чисел. Напиши процедуры сортировки массива различными классическими способами
1С:Напарник для разработки:
> Для сортировки массива чисел различными классическими способами мы рассмотрим три метода: Сортировка пузырьком, Сортировка выбором и Сортировка вставками. Каждый из этих методов имеет свои особенности и применяется в зависимости от конкретных требований и характеристик сортируемых данных.
Сортировка Пузырьком
Сортировка пузырьком — один из самых простых алгоритмов сортировки. Он работает путём многократного прохода по массиву, сравнения соседних элементов и их замены, если они находятся в неправильном порядке. Этот процесс продолжается до тех пор, пока массив не будет отсортирован.
Сортировка Выбором
Сортировка выбором работает путём деления массива на две части: отсортированную и неотсортированную. На каждом шаге из неотсортированной части выбирается минимальный (или максимальный) элемент и перемещается в конец отсортированной части.
Сортировка Вставками
Сортировка вставками также делит массив на отсортированную и неотсортированную части. На каждом шаге берётся первый элемент из неотсортированной части и вставляется в правильное место в отсортированной части.
Ниже приведены реализации этих алгоритмов на языке 1С:

Каждая из этих процедур имеет свои преимущества и недостатки. Сортировка пузырьком проста в реализации, но неэффективна для больших массивов. Сортировка выбором также относительно проста и имеет линейное количество обменов, но она неустойчива. Сортировка вставками эффективна для частично отсортированных массивов и имеет преимущества при работе со связанными списками.
Можно уточнить свой запрос, указав конкретный метод сортировки. Помощником был предоставлен работающий код с подробными комментариями и объяснениями по запросу, реализующий быструю сортировку массива чисел.
Возможности генерации 1С кода по запросу
Помощник может предоставить варианты решения типовых задач, возникающих в 1С разработке. Например, на запрос от пользователя «Как объединить две таблицы значений в одну?» был дан ответ, в котором указаны как непосредственный способ через копирование строк из одной таблицу в другую, так и более быстрые способы, использующие методы объекта встроенного языка ТаблицаЗначений, такие как ЗагрузитьКолонку, Скопировать.
Помощник удобно использовать для генерации типового кода, который периодический используется, но обычно не запоминается, например, фрагмент кода по программному формированию отчета с выводом результатов отчета в дерево значений. Или заготовка-шаблон модуля формы с использованием областей для разработки формы.
В то же время помощник выдает неполные ответы при реализации запросов на генерацию кода, использующего возможности объектов встроенного языка. Например:
Запрос 2.
Пользователь:
> Как считать табличный документ в таблицу значений? Приведи различные способы
1С:Напарник для разработки:
> Чтобы считать табличный документ в таблицу значений, можно использовать различные подходы в зависимости от структуры табличного документа и требований к данным. Ниже приведены несколько способов сделать это.
Способ 1: Чтение табличного документа построчно
Этот способ предполагает чтение табличного документа строка за строкой и заполнение таблицы значений.
// Процедура чтения табличного документа в таблицу значений
Процедура ПрочитатьТабличныйДокументВТаблицуЗначений(ТабличныйДокумент, ТаблицаЗначений)
// Очистить таблицу значений
ТаблицаЗначений.Очистить();
// Проверить, есть ли данные в табличном документе
Если ТабличныйДокумент.ВысотаТаблицы = 0 Тогда
Возврат;
КонецЕсли;
// Создать колонки в таблице значений на основе заголовков в табличном документе
Для Колонка = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
ИмяКолонки = ТабличныйДокумент.Область(1, Колонка).Текст;
ТаблицаЗначений.Колонки.Добавить(ИмяКолонки);
КонецЦикла;
// Заполнить таблицу значений данными из табличного документа
Для Строка = 2 По ТабличныйДокумент.ВысотаТаблицы Цикл
НоваяСтрока = ТаблицаЗначений.Добавить();
Для Колонка = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
НоваяСтрока[Колонка - 1] = ТабличныйДокумент.Область(Строка, Колонка).Текст;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
// Пример использования
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.Прочитать("ПутьКФайлу.xls"); // или другой способ загрузки табличного документа
ТаблицаЗначений = Новый ТаблицаЗначений;
ПрочитатьТабличныйДокументВТаблицуЗначений(ТабличныйДокумент, ТаблицаЗначений);
Способ 2: Использование объекта COMОбъект для чтения Excel-файлов
Если табличный документ получен из Excel-файла, можно использовать COMОбъект для чтения данных напрямую из Excel.
// Процедура чтения Excel-файла в таблицу значений с использованием COM
Процедура ПрочитатьExcelВТаблицуЗначений(ПутьКФайлу, ТаблицаЗначений)
Excel = Новый COMОбъект("Excel.Application");
Excel.Workbooks.Open(ПутьКФайлу);
Лист = Excel.Sheets(1);
// Определить диапазон данных
Диапазон = Лист.UsedRange;
КоличествоСтрок = Диапазон.Rows.Count;
КоличествоКолонок = Диапазон.Columns.Count;
// Создать колонки в таблице значений
Для Колонка = 1 По КоличествоКолонок Цикл
ТаблицаЗначений.Колонки.Добавить("Колонка" + Колонка);
КонецЦикла;
// Заполнить таблицу значений
Для Строка = 1 По КоличествоСтрок Цикл
НоваяСтрока = ТаблицаЗначений.Добавить();
Для Колонка = 1 По КоличествоКолонок Цикл
НоваяСтрока[Колонка - 1] = Диапазон.Cells(Строка, Колонка).Value;
КонецЦикла;
КонецЦикла;
Excel.Quit();
КонецПроцедуры
// Пример использования
ТаблицаЗначений = Новый ТаблицаЗначений;
ПрочитатьExcelВТаблицуЗначений("ПутьКФайлу.xls", ТаблицаЗначений);
Примечания
- Читаемость и производительность: Первый способ универсален и подходит для любых табличных документов. Однако если данные получены из Excel, использование COMОбъект может быть более эффективным, особенно для больших файлов.
- Обработка ошибок: В примерах не показана обработка исключений. В реальном коде следует добавлять Попытка … Исключение … КонецПопытки для обработки потенциальных ошибок, таких как отсутствие файла или неверный формат.
Эти способы позволяют считывать данные из табличных документов в таблицу значений, что может быть полезно для дальнейшей обработки данных в 1С.
В принципе ответ дан, содержит правильные варианты решения, но неполный. Как известно, есть другие решения, использующие объекты встроенного языка 1С. Имеется в виду способ, использующий объект ПостроительЗапроса:
// загружаем табдок в таблицу значений
ОбластиТаб = ТабДок.Область(1, 1, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластиТаб);
Построитель.Выполнить();
ТабДанные = Построитель.Результат.Выгрузить();
В разработке 1С накоплен опыт решения задач, возникающих на практике, способы решений которых затем порождают новые механизмы в разработке для реализации подобных задач оптимальным способом. Например, известная учебная задача получения среза последних на каждую дату. Разными авторами были предложены варианты решения этой задачи, в частности, есть варианты называемые «классическим», «минимальным», «интервальным». «Интервальный» вариант в результате привел к тому, что в типовой конфигурации 1С:ЗУП был реализован механизм интервальных регистров, стандартизирующий и упрощающий получение среза последних на каждую дату. От специализированного в 1С агента искусственного интеллекта ожидаешь осведомленности в истории решения таких задач. Например:
Запрос 3.
Пользователь:
> Есть периодический регистр сведений с измерением Сотрудник типа справочник «Сотрудники» и ресурс оклад типа «Число». У объекта типа «Сотрудники» есть реквизит «ДатаСотрудника» типа «Дата». Напиши запрос для получения значения оклада каждого сотрудника на дату ДатаСотрудника разными способами
1С:Напарник для разработки:
> Чтобы получить значение оклада каждого сотрудника на дату «ДатаСотрудника», можно воспользоваться несколькими способами. Ниже приведены примеры запросов, которые решают эту задачу.
Способ 1: Использование среза последних на нужную дату Этот способ оптимален, если нужно получить оклад на конкретную дату для множества сотрудников.
Сначала, нам нужно получить срез последних на нужную дату. Для этого можно использовать виртуальную таблицу РегистрСведений.Оклады.СрезПоследних.
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
Сотрудники.ДатаСотрудника,
ЕСТЬNULL(ОкладыСрезПоследних.Оклад, 0) КАК Оклад
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Оклады.СрезПоследних(&Дата, Сотрудник В(ВЫБРАТЬ Ссылка ИЗ Справочник.Сотрудники)) КАК ОкладыСрезПоследних
ПО Сотрудники.Ссылка = ОкладыСрезПоследних.Сотрудник
В этом запросе &Дата — это параметр, в который передается значение, используемое для сравнения с «ДатаСотрудника». Однако чтобы подставить именно «ДатаСотрудника» из справочника «Сотрудники», нам потребуется изменить подход, так как напрямую использовать реквизит справочника в отборе виртуальной таблицы нельзя. Поэтому более правильно будет получить дату для каждого сотрудника отдельно и затем уже получать оклад.
Модифицированный Способ 1:
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
ЕСТЬNULL(ОкладыСрезПоследних.Оклад, 0) КАК Оклад
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Оклады.СрезПоследних(Сотрудники.ДатаСотрудника, Сотрудник = Сотрудники.Ссылка) КАК ОкладыСрезПоследних
ПО ИСТИНА
Способ 2: Получение оклада с использованием простого запроса к регистру сведений Этот способ предполагает прямой запрос к регистру сведений с отбором по сотруднику и дате. Однако чтобы получить оклад для всех сотрудников на их «ДатаСотрудника», запрос усложнится.
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
Оклады.Оклад
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ОкладыВложенный.Сотрудник,
ОкладыВложенный.Оклад
ИЗ
РегистрСведений.Оклады КАК ОкладыВложенный
ГДЕ
ОкладыВложенный.Период = (ВЫБРАТЬ
МАКСИМУМ(ОкладыВложенный2.Период)
ИЗ
РегистрСведений.Оклады КАК ОкладыВложенный2
ГДЕ
ОкладыВложенный2.Сотрудник = ОкладыВложенный.Сотрудник
И ОкладыВложенный2.Период <= ОкладыВложенный.Сотрудник.ДатаСотрудника)) КАК Оклады
ПО Сотрудники.Ссылка = Оклады.Сотрудник
Способ 3: Использование запроса с подзапросом для каждого сотрудника Этот способ аналогичен Способу 2, но использует соединение с подзапросом.
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
Оклады.Оклад
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Оклады КАК Оклады
ПО Сотрудники.Ссылка = Оклады.Сотрудник
И Оклады.Период = (ВЫБРАТЬ
МАКСИМУМ(ОкладыВложенный.Период)
ИЗ
РегистрСведений.Оклады КАК ОкладыВложенный
ГДЕ
ОкладыВложенный.Сотрудник = Сотрудники.Ссылка
И ОкладыВложенный.Период <= Сотрудники.ДатаСотрудника)
Каждый из этих способов имеет свои особенности и может быть более или менее подходящим в зависимости от конкретной задачи и требований к производительности.
Помощник привел несколько вариантов, среди которых можно увидеть как, мягко говоря, сомнительные, так и вариант, в частности, в способе 3, наводящий на «классический» вариант решения такой задачи. Но контекст решения задачи данного типа в среде 1С разработчиков содержит информацию в виде большого количества статей, заметок, полезных советов и нестандартных приемов. Возможно, такого ответа достаточно для начинающего программиста. Для дальнейшего развития нужно обладать историей вопроса, черпая оттуда новые идеи в разработке решений. Заставить помощника дать необходимую информацию можно, уточняя и детализируя текст запроса к помощнику. Но для этого нужно самому знать историю вопроса.
В области разработки 1С накоплен опыт по решению большого количества стандартных задач, оформленный как подключаемые библиотеки, в частности, «Библиотека стандартных подсистем». Функционал БСП настолько обширен и разнообразен, что у каждого разработчика есть потребность в инструменте для быстрого поиска нужного алгоритма, реализуемого процедурой или функцией БСП. Есть ожидания, что Помощник может выступить в качестве такого инструмента. Вот пример запроса на нужный функционал.
Запрос 4.
Пользователь:
> Подбери функцию БСП для получения табличной части от ссылки на элемент справочника
1С:Напарник для разработки:
> Для получения табличной части от ссылки на элемент справочника в Библиотеке Стандартных Подпрограмм (БСП) можно использовать функцию ОбщегоНазначения.ПрочитатьТЧ. Однако более универсальным и рекомендуемым подходом является использование стандартных методов платформы «1С:Предприятие», таких как СсылкаНаОбъект.ПолучитьОбъект().ТабличнаяЧасть.
Если же мы говорим о функции БСП, которая может быть использована для этой цели, то стоит отметить, что БСП предоставляет различные утилиты и функции для работы с объектами конфигурации. Например, можно использовать ОбщегоНазначения.ЗначенияРеквизитовОбъекта для получения значений реквизитов объекта, но для табличных частей прямого аналога нет.
Тем не менее если требуется использовать БСП для каких-либо сопутствующих операций, ниже приведён пример, как можно прочитать табличную часть стандартными средствами 1С, а также как использовать некоторые функции БСП.
// Пример получения табличной части стандартными средствами 1С
Процедура ПолучитьТабличнуюЧасть(СсылкаНаЭлемент) Экспорт
Если СсылкаНаЭлемент.Пустая() Тогда
Сообщить("Ссылка пустая");
Возврат;
КонецЕсли;
Попытка
Объект = СсылкаНаЭлемент.ПолучитьОбъект();
ТабличнаяЧасть = Объект.ТабличнаяЧасть; // Здесь "ТабличнаяЧасть" - имя табличной части в объекте
Для Каждого СтрокаТЧ Из ТабличнаяЧасть Цикл
// Обработка строк табличной части
Сообщить(СтрокаТЧ.Номенклатура); // Пример вывода значения реквизита "Номенклатура" табличной части
КонецЦикла;
Исключение
Сообщить("Ошибка при чтении табличной части: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
// Пример использования функции БСП (если таковая имеется для конкретной задачи)
// Например, проверка прав доступа к объекту с помощью БСП
Процедура ПроверитьПраваДоступаКСправочнику(СсылкаНаЭлемент) Экспорт
Если ОбщегоНазначения.ПроверитьПравоДоступа("Чтение", Метаданные.Справочники.Номенклатура) Тогда
// Есть право на чтение
ПолучитьТабличнуюЧасть(СсылкаНаЭлемент);
Иначе
Сообщить("Нет прав на чтение справочника");
КонецЕсли;
КонецПроцедуры
В данном случае мы не используем напрямую функцию БСП для чтения табличной части, поскольку такой функции нет. Однако мы можем использовать стандартные возможности 1С для достижения этой цели.
Если необходимо использовать БСП для каких-либо других целей, связанных с объектом, можно воспользоваться соответствующими функциями и методами, предоставляемыми библиотекой.
Видим, что есть как «фантомные» решения (функция ОбщегоНазначения.ПрочитатьТЧ), так и решения, не релевантные запросу. В БСП, конечно, есть возможность получить данные табличной части от ссылки на элемент справочника, который реализует функция
ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка, ИмяРеквизита, ВыбратьРазрешенные = Ложь, Знач КодЯзыка = Неопределено)
С помощью этой функции в параметр ИмяРеквизита передается имя табличной части. Она возвращает объект РезультатЗапроса, а также через нее можно организовать выборку данных табличной части.
Возможности исправления ошибок, ревью и рефакторинг
Разработка в среде 1С регламентирована, и самой компанией 1С предлагается система стандартов и методик разработки в этой области, которая ориентирует разработчиков на написание кода, оптимально использующего возможности технологической платформы.
Тем не менее помощник предлагает код, не соответствующий рекомендациям 1С. Например, в Запросе 3 есть тексты на языке запросов, которые не следуют рекомендациям 1С к написанию запросов: присутствуют вложенность подзапросов, не используется рекомендуемая функция ЕстьNULL в левом соединении. Попытка запросить адаптацию кода под рекомендации стандартов порой не дает нужного результата: часть рекомендаций все равно упускается из вида.
Запрос 5
Пользователь:
> Модифицируй текст запроса с учетом рекомендаций 1с к написанию запросов
ВЫБРАТЬ Сотрудники.Ссылка КАК Сотрудник, Оклады.Оклад ИЗ Справочник.Сотрудники КАК Сотрудники ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Оклады КАК Оклады ПО Сотрудники.Ссылка = Оклады.Сотрудник И Оклады.Период = (ВЫБРАТЬ МАКСИМУМ(ОкладыВложенный.Период) ИЗ РегистрСведений.Оклады КАК ОкладыВложенный ГДЕ ОкладыВложенный.Сотрудник = Сотрудники.Ссылка И ОкладыВложенный.Период <= Сотрудники.ДатаСотрудника)
1С:Напарник для разработки:
> Чтобы модифицировать текст запроса с учетом рекомендаций 1С к написанию запросов, необходимо следовать рекомендациям по оптимизации и читаемости запросов. В данном случае, запрос уже достаточно оптимизирован, но можно улучшить его читаемость и соответствие рекомендациям.
Модифицированный запрос:
ВЫБРАТЬ
Сотрудники.Ссылка КАК Сотрудник,
Оклады.Оклад
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Оклады КАК Оклады
ПО Сотрудники.Ссылка = Оклады.Сотрудник
И Оклады.Период =
(ВЫБРАТЬ
МАКСИМУМ(ОкладыВложенный.Период)
ИЗ
РегистрСведений.Оклады КАК ОкладыВложенный
ГДЕ
ОкладыВложенный.Сотрудник = Сотрудники.Ссылка
И ОкладыВложенный.Период <= Сотрудники.ДатаСотрудника)
Изменения:
- Отформатирован запрос для лучшей читаемости.
- Используются отступы и переносы строк для разделения логических частей запроса.
- Соблюдены рекомендации 1С по написанию запросов, в частности, использование КАК для псевдонимов таблиц и полей.
Вот еще запрос: ревью кода на соответствие стандартам 1С.
Запрос 6
Пользователь:
> Необходимо провести ревью кода на соответствие стандартам 1С. Описать и прислать список ошибок, которые вы увидели в решении.
Процедура Задача2(СкладОснование, Склад) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПоступлениеТоваровУслуг.Ссылка
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТоварыНаСкладахОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
| ПО ТоварыНаСкладахОстатки.Склад = ПоступлениеТоваровУслуг.СкладОрдер
|ГДЕ
| ТоварыНаСкладахОстатки.Склад = &Склад";
Запрос.УстановитьПараметр("Склад", СкладОснование);
ТЗ = Запрос.Выполнить().Выгрузить();
начатьтранзакцию();
исправитьдокументы(ТЗ,Склад)
КонецПроцедуры
Процедура исправитьдокументы(ТЗ,Склад)
Для каждого т Из тз Цикл
о = стр.ссылка.получитьОбъект();
о.склад = склад;
о.записать();
Сообщить("По документу - " + т.Ссылка + " изменили склад на " + т.Ссылка.Склад + " , вид склада - " т.Ссылка.Склад.ВидСклада)
КонецЦикла;
ЗафиксироватьТранзакцию();
КонецПроцедуры
1С:Напарник для разработки:
> Проведем ревью кода на соответствие стандартам 1С.
Список выявленных ошибок и рекомендаций:
- Несоответствие имени параметра и переменной: в процедуре Задача2 используется переменная СкладОснование, но передается в запрос параметр «Склад». Рекомендуется использовать одинаковые имена для переменных и параметров.
- Использование нерекомендуемых имен: имена процедур и переменных не соответствуют стандартам 1С. Например, Задача2 и исправитьдокументы следует переименовать в соответствии с PascalCase (например, ОбновитьСклад и ИсправитьДокументы).
- Отсутствие проверки результата запроса: в процедуре Задача2 не проверяется результат выполнения запроса. Рекомендуется добавить проверку на пустой результат.
- Некорректное использование транзакции: в процедуре Задача2 транзакция начинается, но не обрабатываются возможные исключения. Рекомендуется использовать Попытка … Исключение … КонецПопытки для обработки ошибок и отката транзакции в случае необходимости.
- Отсутствие проверки прав: в процедуре исправитьдокументы не проверяются права на изменение документов. Рекомендуется добавить проверку прав перед изменением документов.
- Не корректное использование Сообщить: в процедуре исправитьдокументы используется Сообщить с некорректным синтаксисом. Рекомендуется исправить синтаксис и использовать более информативные сообщения.
- Неиспользование областей: код не использует области (#Область) для группировки логически связанных процедур.
- Неиспользование комментариев: код не содержит комментариев, что затрудняет понимание логики.
Исправленный код:
#Область ОбновлениеСклада
Процедура ОбновитьСклад(СкладОснование, Склад) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ПоступлениеТоваровУслуг.Ссылка
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(, ) КАК ТоварыНаСкладахОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
| ПО ТоварыНаСкладахОстатки.Склад = ПоступлениеТоваровУслуг.СкладОрдер
|ГДЕ
| ТоварыНаСкладахОстатки.Склад = &Склад";
Запрос.УстановитьПараметр("Склад", СкладОснование);
ТЗ = Запрос.Выполнить().Выгрузить();
Если ТЗ.Количество() = 0 Тогда
Сообщить("Не найдено документов для обновления");
Возврат;
КонецЕсли;
Попытка
НачатьТранзакцию();
ИсправитьДокументы(ТЗ, Склад);
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Сообщить("Ошибка обновления документов: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Процедура ИсправитьДокументы(ТЗ, Склад)
Для Каждого Стр Из ТЗ Цикл
Док = Стр.Ссылка.ПолучитьОбъект();
Если Док.ПраваДоступа("Изменение") Тогда
Док.Склад = Склад;
Док.Записать();
Сообщить("По документу - " + Стр.Ссылка + " изменили склад на " + Склад + " , вид склада - " + Склад.ВидСклада);
Иначе
Сообщить("Недостаточно прав для изменения документа: " + Стр.Ссылка);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
Исправлены явные ошибки, даны предупреждения на возможные ошибки, учтены некоторые рекомендации стандарта разработки 1С, но не все. Надо явно просить помощника, придумывая детальные запросы, «подумать» о правомерности использования функции «Сообщить», о том, оптимально ли выгружать данные запроса в таблицу значений, оптимально ли выводить пользователю в цикле ссылку, правильно ли фильтруются записи виртуальной таблицы Остатки.
К вопросу об использовании ИИ в разработке 1С кода
Что дает использование умного помощника с технологией ИИ в разработке 1С решений?
Надо признать, что это инструмент, у которого сильная сторона – скорость генерации кода, «моментальная», с точки зрения человеческого восприятия. Но результат носит вероятностный характер, потому что агент ИИ имитирует процесс написания кода, неизбирательно «посматривая» на созданные ранее образцы. И поэтому может допускать ошибки, которые выглядят очень убедительно. Как показывают разобранные примеры, помощник быстрее разработчика пишет шаблонный рутинный код, например, код для генерации тестовых данных или автоматическое комментирование кода на грамотном естественном языке. Там надо просто воспроизвести по аналогии уже ранее написанный код.
А что по поводу написания более сложного кода, который изобретается для решения нестандартных задач, подкидываемых практикой? Решение таких задач – итеративный мыслительный процесс, который можно представить себе как движение по «герменевтической» спирали, сворачивающейся из точки исходных данных в точку, иллюстрирующее точное, идеальное решение. На каждом обороте спирали создается решение, которое еще «ближе» к искомому идеальному. Каждый виток демонстрирует степень понимания задачи и степень близости к ее успешному решению. Процесс не обязательно заканчивается в конечной точке идеального решения, а останавливаются на итерации с удовлетворяющими показателями.
Количество оборотов спирали обратно пропорционально степени понимания. Скорость прохождения текущего витка выступает как образ скорости написания программного кода. Высокая квалификация разработчика позволяет сократить и количество витков и увеличить скорость прохождения текущего оборота спирали. Агент ИИ может обнаружить, а может и не найти спираль решения, причем есть ненулевая вероятность предложения мнимой, «фантомной» спирали. Разработчик, создавая детальные подробные «промты» запросов, может управлять движением в нужном направлении, используя скорость помощника по созданию программного кода.
Получается, что создавать качественный, соответствующий стандартам 1С код, применяя помощник ИИ, способен разработчик с широким практическим опытом и высокой квалификацией в сфере разработки 1С. При этом для эффективного использования помощника ИИ еще нужны специфические опыт и знания по написанию правильных запросов, которые по полной используют возможности ИИ в нужном направлении.
Словарь иностранных слов к статье
| Иностранное слово / термин | Язык-источник | Толкование на русском языке |
|---|---|---|
| Агент (искусственного интеллекта) | лат. agens — действующий, деятель | Программная сущность, действующая автономно или полуавтономно для выполнения задач пользователя (в статье — ИИ, формирующий ответ). |
| Библиотека стандартных подсистем (БСП) | греч. βιβλιοθήκη — собрание книг + лат. standard — образец, норма + греч. ύποσύστημα — под + система | Набор готовых функциональных блоков (подсистем) для типовых задач в 1С, предоставляемый компанией 1С. |
| Генерация (кода) | лат. generatio — рождение, порождение | Автоматическое создание программного кода на основе запроса или шаблона. |
| Герменевтический (спираль) | греч. ἑρμηνευτική — искусство истолкования, разъяснения | Характеристика процесса познания, при котором понимание достигается через последовательные циклы уточнения (в статье — движение к идеальному решению). |
| Интервальный (регистр) | лат. intervallum — промежуток, расстояние | Характеристика способа хранения данных с явными датами начала и окончания действия значения. |
| Искусственный интеллект (ИИ) | лат. artificialis — сделанный, неестественный + лат. intellectus — понимание, разум | Область компьютерных наук и технологий, занимающаяся созданием систем, способных выполнять задачи, обычно требующие человеческого разума. |
| Итеративный (процесс) | лат. iteratio — повторение | Циклический, многократно повторяющийся процесс, где каждый цикл приближает результат к целевому. |
| Классический (вариант) | лат. classicus — образцовый, первоклассный | Типовой, наиболее известный и часто используемый способ решения задачи. |
| Комбинаторика | лат. combinare — соединять, сочетать | Раздел математики, изучающий перестановки, сочетания и размещения элементов. |
| Конфигуратор | лат. configuratio — взаиморасположение, построение | Режим работы системы «1С:Предприятие», предназначенный для редактирования конфигурации (прикладного решения). |
| Массив (чисел) | араб. через франц. massa, лат. massa — ком, глыба | Упорядоченный набор данных одного типа, хранящийся в памяти под одним именем. |
| Механизм (интервальных регистров) | греч. μηχανή — орудие, приспособление | Совокупность согласованных программных объектов и алгоритмов для решения определённого класса задач. |
| Модификация (кода) | лат. modificatio — видоизменение, приведение к должной мере | Изменение существующего программного кода с целью улучшения или адаптации. |
| Напарник (1С:Напарник) | русское (от «на парах»), но как бренд — не требует перевода. Оставлено без пояснения как русское слово. | — |
| Объектно-реляционная парадигма | лат. objectum — предмет + relatio — отношение + греч. παράδειγμα — пример, образец | Способ организации данных, совмещающий объектное представление (сущности) и реляционное хранение (таблицы). |
| Оптимизация (кода) | лат. optimus — наилучший | Процесс улучшения кода для повышения его быстродействия, уменьшения потребляемых ресурсов или улучшения читаемости. |
| Парадигма | греч. παράδειγμα | Совокупность фундаментальных принципов и понятий, определяющих стиль разработки и мышления в определённой области. |
| Платформа (1С:Предприятие) | фр. plateforme — плоская основа, подставка | Программная среда, обеспечивающая исполнение прикладных решений и управление данными. |
| Построитель запроса | русское слово «построитель» (от «строить») + «запрос». Не иностранное. | — |
| Промт (англ. prompt — подсказка, напоминание) | англ. prompt | Текст запроса на естественном языке, подаваемый пользователем на вход генеративной нейросети или ИИ-помощника. |
| Регистр сведений | лат. registrum — список, перечень | Объект метаданных 1С для хранения данных в разрезе измерений с возможностью привязки ко времени. |
| Рефакторинг | англ. refactoring — перестройка, изменение структуры | Процесс переработки внутренней структуры программного кода без изменения его внешнего поведения, направленный на улучшение читаемости и поддержки. |
| Ревью (кода) | англ. review — просмотр, пересмотр, проверка | Анализ программного кода другими разработчиками с целью выявления ошибок, несоответствий стандартам и потенциальных улучшений. |
| Сервис (облачный) | лат. servitium — услуга, обслуживание | Способ предоставления программных функций через сеть (интернет) по модели «по запросу». |
| Сортировка (пузырьком, выбором, вставками) | лат. sortis — род, вид, сорт | Упорядочивание элементов массива по заданному правилу (сравнению). Сами названия алгоритмов — кальки, но слово «сортировка» иностранное. |
| Спираль (герменевтическая) | греч. σπείρα — виток, изгиб | Образ циклического развития, где каждый оборот поднимает решение на новый уровень понимания. |
| Срез последних | русское слово «срез» (от «резать») + «последних». Не иностранное. | — |
| Таблица значений | русское слово «таблица», «значений». Не требуется. | — |
| Табличный документ | русское слово «табличный», «документ» (лат. documentum — свидетельство). «Документ» — иностранное. | Документ (в контексте 1С) — программный объект для хранения структурированных данных, часто в виде электронной таблицы. |
| Транзакция | лат. transactio — соглашение, сделка | Группа последовательных операций с данными, которая выполняется как единое целое (либо все операции успешны, либо ни одна не применена). |
| Фантомный (решение) | греч. φάντασμα — призрак, видение | Мнимый, несуществующий в реальности (в статье — о нерабочих или вымышленных функциях, предлагаемых ИИ). |
| Фибоначчи (числа) | итал. Fibonacci (имя средневекового математика) | Бесконечная последовательность чисел, где каждое следующее равно сумме двух предыдущих. |
| Фреймворк | англ. framework — каркас, несущая конструкция | Программная платформа, определяющая структуру приложения и предоставляющая готовые компоненты для его сборки. |
| Холивар | англ. holy war — священная война (жаргонное) | Бесконечный, эмоциональный спор на тематических форумах, в котором участники не стремятся услышать оппонента. |
| Чат | англ. chat — болтовня, разговор | Сервис обмена текстовыми сообщениями в реальном времени (в статье — чат «1С:Напарник для разработки» на портале 1С). |
| EDT (1С:EDT) | англ. Eclipse Development Tools | Среда разработки на базе Eclipse, используемая для создания конфигураций 1С. Аббревиатура, но расшифровка иностранная |
Все комментарии
Чтобы оставить комментарий, необходимо войти или зарегистрироваться.
Пока нет комментариев. Будьте первым!