Типичные ошибки 1с программиста

Довольно часто начинающие 1С разработчики сталкиваются с ошибками, которых достаточно легко избежать. Ниже мы рассмотрим топ 11 ошибок и способы их исправления. Также доступна видеоверсия статьи

Содержание

Поле объекта не обнаружено

1С ошибка Поле объекта не обнаружено

Существует множество статей, которые описывают возможные причины возникновения в 1С ошибки “Поле объекта не обнаружено”. Порой это связывают с обновлением платформы, обновлением типового релиза, или с какими-то другими причинами.

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

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

  • Удалили табличную часть, к которой обращаемся в коде?
  • Переименовали реквизит, а в коде не исправили?
  • Заменили значение со ссылки на неопределено?

Вуаля – платформа выдаст ошибку “Поле объекта не обнаружено”!

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

Например, у объекта “СообщениеПользователю” нет свойства “Таблица”, и следующий код приведет к ошибке:

Сообщение = Новый СообщениеПользователю;
Сообщение.Таблица = “Ошибка”;

Индекс находится за границами массива

1С ошибка Индекс находится за пределами массива

Что означает такое сообщение системы? Как правило, с данной ошибкой разработчик сталкивается при некорректной работе с коллекциями. Самые частые случаи появления ошибки “Индекс находится за границами массива”.

  • Использование при обходе коллекции количества элементов вместо индекса. Индексы начинаются с нуля, а количество элементов – с единицы. Поэтому следующий код гарантированно приведет к ошибке: Массив[Массив.Количество()]
  • Последствия удаления элементов из коллекции, очистки коллекции или замены коллекции на пустую
  • Ошибочное увеличение счетчика в цикле “Для”

 Как исправить? Для удаления элементов из коллекции по условию – использовать обратный цикл. Добавлять условие на соответствие счетчика цикла и индекса массива. Не увеличивать счетчик внутри кода цикла Для … Цикл … КонецЦикла

Обращение к процедуре как к функции

ОШибка

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

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

А вот неправильное использование процедуры синтаксическая проверка (Ctrl + F7) успешно обнаруживает, и не даст сохранить конфигурацию или внешнюю обработку/отчет, пока ошибка не будет устранена.

Рассмотрим два примера:

1. Воспроизведем ошибку “Обращение к процедуре как к функции”. При этом платформа не даст сохранить изменения, т.к. не проходит синтакс-контроль.

2. Воспроизведем ошибку “Обращение к процедуре объекта как к функции”. Здесь мы неверно используем метод объекта массива “Добавить”, который является процедурой.

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

Процедура не может возвращать значение

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

В процедуре можно написать ключевое слово “Возврат” без параметров. Это будет означать выход из процедуры.

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

Процедура ПроцедураНеМожетВозвращатьЗначение(Команда)
Возврат "Ошибка";
КонецПроцедуры

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

Переменная не определена

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

  • Опечатка в имени переменной
  • Обращение к переменной, которая нигде в области видимости не объявлена (неявной инициализацией с присвоением значения, явным образом с использованием ключевого слова “Перем”, или передана в качестве параметра)
  • Написание на клиенте серверного кода. Например, обращение к менеджеру справочников “Справочники”, и т.п. Клиентская часть приложения “не видит ” серверные объекты языка
  • Также ошибка может появиться, если ранее код использовался в режиме толстого клиента, но после был запущен в тонком клиенте.

Как исправить?

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

Значение не является значением объектного типа

Ошибка “Значение не является значением объектного типа” может возникнуть при неверном обращении к объекту языка. Объектный тип – это такие объекты языка, которые содержат в себе другие объекты – свойства, реквизиты и т.п. Эти свойства доступны через точку, например “Объект.СвойствоЭтогоОбъекта”

Но если через точку попытаться использовать какое-то значение, которое внутри себя свойств не имеет – например, любое значение примитивного типа – это и приведет к ошибке.

Разберем более сложный пример:

&НаСервере
Процедура ЗначениеНеЯвляетсяЗначениемОбъектногоТипаНаСервере(Справочники = Ложь)
Сообщить(Справочники.Сотрудники.ПустаяСсылка());
КонецПроцедуры

Ошибка может быть “плавающей”. Если вместо параметра по умолчанию “Справочники = Ложь” будет передан менеджер справочников, то ошибки возникать не будет. А если вызвать процедуру без параметров, то будет использоваться параметр по умолчанию с типом Булево, что и приведет к ошибке.

Чаще всего чтобы исправить ошибку, нужно в отладчике посмотреть, какой тип значения используется. Можно внести изменения в код, чтобы обеспечить корректное поведение (например, в запросе вместо наименования товара выбрать ссылку, и в коде через точку уже обращаться к свойствам ссылки, а не текстового наименования). А можно добавить проверку на нужный тип значения. Т.е. – если значение того типа, который мы ожидаем – выполняем код. Иначе – не выполняем.

Ошибка при вызове метода контекста

Ошибка при вызове метода контекста

Обнаружены ошибки в 1С Синтаксическая ошибка

В языке 1С у разных объектов (запросов, справочников, табличных документов и др.) есть предопределенные методы, предусмотренные платформой. Обращение к этим методам требует соблюдения порядка и параметров, правильного синтаксиса и соблюдения условий использования. Например, при чтении табличного документа из файла он не должен быть открыт в другой программе, при подключении к http-соединению оно должно быть доступно, и т.п.

Если эти условия не соблюдать, платформа в зависимости от версии может выдавать сообщения вида “Ошибка при вызове метода контекста”, и далее будут следовать более подробные сведения об ошибке – стек вызовов, приведших к ошибке, номер строки и позиции в строке, где произошла ошибка.

Чаще всего ошибка при вызове метода контекста встречается в следующих методах:

  1. Записать
  2. Прочитать
  3. Выполнить
  4. Создать
  5. ПроверитьВывод

Разберем эту ошибку на примере метода Выполнить объекта Запрос:

Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 1 1 ГДЕ ИСТИНА И");
Запрос.Выполнить();

В тексте запроса допущена ошибка –  после первого условия “ГДЕ ИСТИНА” указан оператор И, но после него нет еще одного условия. В результате при попытке выполнения запроса, платформа вернет ошибку.

Для исправления ошибки зачастую достаточно внимательно использовать методы, при необходимости уточнять порядок, количество и тип параметров – это можно сделать в справке или синтакс-помощнике (встать курсором на имя метода в коде, и нажать сочетание клавиш Ctrl+F1). В случае запроса – нужно передавать синтаксически корректный текст запроса; в случае проверки вывода на печать – в системе должен быть установлен принтер; в случае подключения к почте – должны быть корректно указаны логин и пароль, и т.п.

Тип не может быть выбран в запросе в 1С 8.3 (8.2)

Ошибка Тип не может быть выбран в запросе

С такой ошибкой начинающие разработчики (да и не только начинающие 😉 ) сталкиваются чаще всего, при чтении запросом данных из таблиц значений, либо из регистров сведений. Все дело в том, что запросы поддерживают далеко не все типы значений. Так, например, нельзя запросом выбрать тип Картинка, ХранилищеЗначений, Шрифт, и многие другие типы, которые не относятся к примитивным или ссылочным типам значений.

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

Еще одна ситуация, когда запрос будет выдавать ошибку – если таблица значений, которая передается в качестве параметра, имеет не типизированные колонки.

Неверно:

//ТЗОшибочныйТип.Колонки.Добавить("Контрагент");

Верно:

//ТЗОшибочныйТип.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));

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

Использование в 1С модальных окон в данном режиме запрещено

Ошибка Использование в 1С модальных окон в данном режиме запрещено​

Платформа будет выдавать такое сообщение, если в коде используются методы, приводящие к открытию модальных окон. Модальные окна – это окна, которые при открытии блокируют весь остальной интерфейс. В 1С есть несколько модальных методов – например – “Вопрос”, “ОткрытьЗначение”, “Предупреждение”. Кроме того, в коде может использоваться модальный синтаксис открытия форм: “ОткрытьМодально()”

Если в свойствах конфигурации выбран режим использования модальности “Не использовать”, то выполнение модальных методов будет приводить к этой ошибке “Использование в 1С модальных окон в данном режиме запрещено”.

Для устранения ошибки можно пойти несколькими путями. Как водится, один – быстрый, другой – правильный 🙂

Быстрый способ – переключить режим использования модальности в положение “Использовать”.

Более правильный способ – использовать в коде немодальные вызовы методов. Например, у метода “Вопрос” есть немодальный аналог  – “ПоказатьВопрос”, у метода “Предупреждение” – “ПоказатьПредупреждение”, и т.п. Чаще всего об этих методах дополнительно указано в синтакс-помощнике и справке.

Кроме того, в последних версиях платформы появились асинхронные методы – “ВопросАсинх”, “ПредупреждениеАсинх” и др. Появление этих методов позволяет писать более простой и понятный асинхронный код, и направлено в первую очередь, на более полноценную поддержку браузерами и работу в веб-клиенте.

1С 8.3 и 8.2: Запись с такими ключевыми полями существует!

Данная ошибка появляется при некорректной записи в регистр сведений. Чаще всего с этой ошибкой сталкиваются начинающие разработчики, не до конца понимающие механизмы работы с ключевыми полями (измерениями).

Суть ошибки следующая – регистр сведений позволяет записать запись (строку таблицы) с уникальным набором ключевых полей – а для периодических регистров также и поля Период. Если следующая запись полностью повторяет значение ключевых полей, но осуществляется методом Записать с параметром Замещать = Истина, то запись в таблице регистра просто заменится на идентичную.

Однако если поместить две абсолютно одинаковые записи в набор записей, и попытаться его записать – платформа выдаст ошибку. Еще один распространенный случай, когда 1С сообщает “Запись с такими ключевыми полями существует” – это запись в периодический регистр сведений с периодичностью от “День” и выше, подчиненный регистратору.

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

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

Поле объекта недоступно для записи в 1С

Ошибка Поле объекта недоступно для записи в 1С​

Чаще всего начинающие программисты 1С сталкиваются с этой ошибкой в двух ситуациях.

Первый случай – это попытка редактирования системных полей, недоступных для записи. Например, в модуле формы сама форма будет содержаться в объекте ЭтаФорма. И попытка присвоить этому реквизиту любое значение приведет к ошибке “Поле объекта недоступно для записи”.

Второй случай – и с ним новички как раз допускают больше всего ошибок – это попытка редактирования полей ссылки, а не самого объекта. Чаще всего код выглядит примерно так:

Элемент = Справочники.Сотрудники.НайтиПоКоду("12345");
Элемент.Наименование = "Новое наименование";

 

Исполнение данного кода приведет к ошибке, т.к. поля ссылки доступны только для чтения, а метод НайтиПоКоду вернет именно ссылку. Чтобы можно было внести изменения, следует из ссылки получить сам объект – используя соответствующий метод ПолучитьОбъект().

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

Ссылка на обработку

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

Заключение

Как видите, зачастую ошибки тривиальны, и достаточно просто исправляются. Общие рекомендации – внимательно читать документацию и справку, корректно использовать методы, активно пользоваться отладчиком. Если вы новичок, и хотите освоить программирование в 1С с нуля – могу предложить приобрести мой базовый курс для начинающих. Более подробная информация – по ссылке.

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

  • неоправданному расходу ресурсов компьютера (сервера);
  • искажению данных при чтении или записи.

Содержание

  1. Получение данных не из регистра
  2. Запрос в цикле и обращение через точку
  3. Ошибки в запросах к таблицам регистров
  4. Неверный контекст выполнения процедур и функций

Получение данных не из регистра

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

То есть правильно придерживаться такой схемы:
Документ – Регистр – Отчет.

Запрос в цикле и обращение через точку

Примером такой ошибки является конструкция типа:

Пока Выборка.Следующий() Цикл
А = Выборка.Ссылка.Договор;
КонецЦикла;

Как видим, внутри цикла мы делаем так называемый неявный запрос.

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

Во-вторых, даже без цикла такая конструкция неоптимальна, потому что платформа инициализирует все поля объекта Выборка.Ссылка.

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

ВЫБРАТЬ

ПоступлениеТоваровУслуг.Ссылка,

ПоступлениеТоваровУслуг.Ссылка.Договор

ИЗ

Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг

ГДЕ ПоступлениеТоваровУслуг.Ссылка = &Ссылка

Ошибки в запросах к таблицам регистров

Грубейшей ошибкой является использование конструкции ГДЕ … в запросе к таблице регистра накопления вместо того, чтобы установить отбор в параметрах виртуальной таблицы.

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

Приведем пример:

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

В этом случае платформа выберет все записи таблицы регистра сведений “Цены номенклатуры”, а потом отбросит ненужные. Результат Вы получите, только система потратит впустую ресурсы.

Неверный контекст выполнения процедур и функций

При разработке в режиме управляемого приложения мы можем использовать так называемые директивы компиляции – &НаКлиенте, &НаСервере, &НаСервереБезКонтекста и прочие.

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

Автор в рамках данной статьи не ставит своей целью показать все ошибки начинающих программистов. Ошибок много (как и программистов), и их делают все, но самое главное в процессе работы – не совершать их в будущем. А для этого необходимо постоянно работать над повышением своей квалификации.

Рекомендуем Вам делать “аудит” своих работ, которые имеют определенный срок давности.

Когда 1С подтормаживает — это не потому, что «вы ничего с этим не делаете».

Мы-то делаем. Правда, не всегда то и не всегда сразу :)

Только, если честно – порой 1С тормозит потому, что какие-то вещи мы все же не предусмотрели…

И да, это не только для новичков и стажеров – специалистам со стажем тоже нелишне посмотреть, потому что никто не знает 1С целиком.

Плюс, потом можно «направлять» в это видео падаванов :)

Видео короткое — 17 минут. Можно быстренько посмотреть и все исправить, пока никто не заметил : )

Приятного просмотра!

video

Тайминг ключевых моментов в видео:

00:10 — Ошибка № 1. Блокировки и транзакции
03:22 — Ошибка № 2. Правила записи регистров
06:00 — Ошибка № 3. Что здесь не так?
08:33 — Ошибки при записи большого объема данных
12:59 — Ошибки при записи наборов.

Что делать, чтобы вообще с таким не сталкиваться?

Ответ понятен – один раз сесть и разобраться.

На нашем курсе по ускорению и оптимизации 1С Вы узнаете:

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

А еще научитесь:

  • Точно проводить замеры времени открытия формы / формирования отчета / проведения документа
  • Настраивать MS SQL, регламентные операции SQL и 1С
  • Анализировать и оптимизировать запросы
  • И многим другим полезным вещам :)

Это как водить машину.

Да, сначала займет время.

Но потом Вы смотрите на тех, кто не умеет – и понимаете, что это просто обязательный навык.

Посмотрите, что мы разбираем в курсе – и записывайтесь:

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

И вроде все правильно сделал – и дома проверил, принес в офис – еще раз проверил….

А через день – полдня работы офиса коту под хвост – и ненужная встреча с боссом…

Мы сделали свою версию такого списка – наши “тринадцать”:

Интро:  Грустная история про одного программиста…

Смотреть

1 Ошибка №1.
(Не) зависимость конфигурации от варианта работы платформы

Смотреть

Вы встречали мутабельные значения? Если нет, то все еще впереди…смотрим

Смотреть

Использование инструкций препроцессору. Различное поведение в файловом и клиент-серверном вариантах

Смотреть

Устранение передачи мутабельных значений

Смотреть

Корректная обработка инструкций препроцессору

Смотреть

Разница между работой базы в файловом варианте и клиент-сервером. К сожалению, она есть…

Смотреть

Использование сервиса «Проверка конфигурации»

Смотреть

Опять мутабельные значения. Вы думаете, что с ними не встретитесь? Ничего подобного!

Смотреть

2 Ошибка №2.
Разработка отчетов и их работоспособность под разными пользователями

Смотреть

Элегантное решение описанной проблемы. Программный интерфейс

Смотреть

Отладка разработанного алгоритма

Смотреть

3 Ошибка №3.
Беспечное использование типовых алгоритмов конфигураций…или рога и копыта…

Смотреть

Нужно знать «в лицо» конфигурацию, с которой работаете – и ничему не верить (новый релиз – новые необъявленные правила)…

Смотреть

4 Ошибка №4.
Объектное чтение данных. Почему не работает метод под определенным пользователем??

Смотреть

Правильное обращение к данным

Смотреть

Скачать

Чтобы скачать эти файлы – нажмите на ссылку правой кнопкой мыши и выберите “Сохранить как” (“Сохранить по ссылке”).

Скачать все в архиве (WinRAR + 3% на восстановление): https://www.spec8.ru/followup/0module/0module.rar

Это первые 4 из 13-ти… Вы их можете скачать и посмотреть свободно – указаны прямые линки на просмотр и скачивание.

А вот следующие  9 разобранных ошибок мы предоставляем только подписавшимся на рассылку (см. ниже).

Итак, продолжение:
  • Ошибка №5. Платформа 8.2. Новые возможности для создания трудноуловимых ошибок.
    • Схема решения представленной проблемы.
  • Ошибка №6. Чудеса в обычных формах. Опять 8.2 «шалит».
    • Разложим по полочкам поведение платформы
  • Ошибка №7. «Правильно» разработанная конфигурация, может списать остатки в минус. Не верите? Посмотрим.
    • Исправление «правильной» конфигурации, тестирование.
  • Ошибка №8. «Зависание» движений в регистрах. Еще одна возможность 8.2 :)
    • Разбираем поведение платформы. На самом деле все правильно. Лекарство очевидно.
  • Ошибка №9. Ошибки во время исполнения.
    • Как такие ошибки правильно отлавливать.
  • Ошибка №10. Изменения в базе данных в несколько этапов. Возможные проблемы.
    • Решение поставленной проблемы.
  • Ошибка №11. Изменение структуры регистров. Потенциальные проблемы.
    • Методы корректного изменения структуры данных.
  • Ошибка №12.Получение остатков в отчете. Проблема получения остатков на конец дня.
    • Решение задачи получения правильного остатка.
    • Та же самая задача в отчете на СКД.
  • Ошибка №13. Коллекция элементов. Требуется удалить некоторые значения. Можно наступить на очередные грабли.
    • Описываем, как правильно делать удаление.

Это видео-материалы доступны только после регистрации на рассылку (они рассылаются через внешний сервис рассылки).

<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='

Related Posts

  • Получение логина и пароля техподдержки 1С из базы
  • Класс для вывода отчета в ExcelКласс для вывода отчета в Excel
  • Счет-фактура для УПП
  • Библиотека классов для создания внешней компоненты 1С на C#
  • Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
  • Прайс-лист с артикулом в отдельной колонке

40 Comments

  1. п.8 Какой то не очень удачный пример.

    используйте условия проверки РезультатЗапроса.Пустой()

    или

    Выборка.Следующий().

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

    Reply

  2. … Если НЕ Результат=Неопределено ИЛИ Результат=Истина Тогда … // правильно
    

    ААА! Можно мне развидеть это?!

    Reply

  3. IRL не все, и не так уж очевидно.

    Например:

    п. 11. Сами разработчики 1С зачастую забивают на это правило. Кроме того если речь идет об обработке, которая запускается раз в месяц, не имеет значение будет ли она выполняться 30 секунд или 10 минут.

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

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

    Reply

  4. (2) baton_pk,

    ААА! Можно мне развидеть это?!

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

    Reply

  5. (4) TODD22, мы не старались описать все возможные варианты и привести решения, на самом деле показан один из примеров реализации. Для случая когда результат не только булево решение такое но более элегантное:

    …
    Если НЕ Результат=Неопределено // не забыть перенос на другую строку :-)))
    И Результат Тогда
    …
    КонецЕсли;
    …
    

    Reply

  6. (1) TODD22, Можно привести совсем идеальный правильный вариант:

    …
    Результат = Запрос.Выполнить();
    Если НЕ Результат.Пустой() Тогда
    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
    …
    КонецЦикла;
    КонецЕсли;
    …
    

    Показать

    Reply

  7. (3) peterxx,

    Сами разработчики 1С зачастую забивают на это правило.

    Давайте стремиться к лучшему, а то получается какая-то «круговая порука».

    Никто не говорит, что она идеальна, но очень много функций уже в ней есть.

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

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

    Reply

  8. (7)

    Никто не говорит, что она идеальна, но очень много функций уже в ней есть.

    Сталкивался пару раз с тем что внезапно менялись функции и приходилось устранять возникающие при этом ошибки. Это было в БСП.

    Так что теперь стараюсь всё выносить максимально в свои модули.

    Reply

  9. (4) (5)

    Зачем эти ДВА условия?!

    Если Результат = Истина Тогда // Этого вполне достаточно
    Если Результат = ДокументОснование Тогда // Зачем тут ещё одно сравнение с неопределено?
    

    К тому же возмутился я тем, что условие отработает неверно в случае когда Результат=Ложь.

    Reply

  10. (9) baton_pk,

    Согласен поспешил с ответом. Поправил комментарий, теперь условие отражает суть ответа )

    Reply

  11. Если НЕ Результат=Неопределено // не забыть перенос на другую строку :-)))
    И Результат Тогда
    …
    КонецЕсли;
    

    Если можно просто

    Если Результат = Истина Тогда // …
    

    Reply

  12. 6. Формат строки. (ошибки, код)

    Не забывайте про формат строки, т.к. 1С число преобразует в строку с пробелом между разрядами.

    Вид получаемой строки зависит от локализации решения. Если лень прочитать книги по разработке и проектированию решений — такие статьи не помогут.

    Reply

  13. 5. В первую очередь надо избегать таких случаев. Либо метод возвращает булево, либо надо использовать объект (структуру) для возврата.

    21. >

    НЕ Контрагент=Значение(Справочник.Контрагенты.ПустаяСсылка)

    В 1С есть знак «не равно».

    Контрагент <> Значение(Справочник.Контрагенты.ПустаяСсылка)

    Reply

  14. (13) bonv,

    для «не равно» надо раскладку переключать простым смертным (у кого нет снегопатов и шаблонов). так что «не .. = ..» имеет право на существование 🙂

    Reply

  15. (14) baton_pk, сильный аргумент 🙂

    Но с другой стороны это же запрос, а в конструкторе мышкой «не равно» проще выбрать, чем вписать «НЕ .. = ..» 😉

    Reply

  16. Хотелось бы узнать, корректно ли использовать конструкцию вида

    Если НЕ Результат=Неопределено

    Ведь если Результат равен Неопределено, то выражение Не Результат при вычислении дает ошибку «{(1)}: Преобразование значения к типу Булево не может быть выполнено»

    Аналогичную ошибку дает код

    Стр = ТабЗнч.Найти(«Значение», «Колонка»);
    Если Не Стр = Неопределено Тогда
    ………..
    КонецЕсли

    Reply

  17. (16) BigClock,

    А = Неопределено;
    Если Не А = Неопределено Тогда
    
    КонецЕсли;
    

    Отрабатывает без ошибок (8.2.19.83).

    В любом случае, лучше использовать скобки 🙂

    Reply

  18. (15) bonv,

    а в конструкторе мышкой

    Открою маленький секрет: далеко не всегда люди пользуются конструктором запросов. 😉

    Reply

  19. (14) Чтобы не переключаться хорошо помогает это специальная раскладка клавиатуры с сайта Павла Чистова http://1c.chistov.pro/2012/11/1.html

    Где-то, вроде даже, на сайте ИТС или Евгения Гилева, была статья о том, что с <> нужно пользоваться осторожно, и рекомендуют использовать именно конструкцию (Не … = …)

    Reply

  20. (19) jeyrico,

    «<>» от лукавого. Не понимаю, почему 1С до сих пор не сделали «!=».

    Reply

  21. (20) Может потому, что это будет знатный холивар насчет было стало.

    Reply

  22. (18) baton_pk,

    Открою маленький секрет: далеко не всегда люди пользуются конструктором запросов. 😉

    Чорт, правда что ли 🙂

    Ну а если серьезно, то исходить все же надо из того что код пишется для людей. И прямое условие читать все же проще.

    Хотя мне тоже более привычен «!=».

    Reply

  23. Начиналось все хорошо, но последние пункты весьма спорные. Использование «В» и «Объединить» в запросах лично меня напрягают. Так же как «ИЛИ». В свое время оптимизировал тормозной запрос, пробовал разные варианты и в итоге соединение оказалось самым быстродейственным вариантом замены «ИЛИ».

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

    В общем совет для запросов — смотреть профайлер и планы исполнения. Почитать книжки по тому как там все устроено, ужаснуться как все сложно и непредсказуемо, как один вариант увеличивает количество операций чтения, а другой загрузку процессора… Попаниковать, расслабиться и начать делать по принципу «А ладно, не тромозит и фиг с ним». Шутка. 🙂

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

    Я бы тут порекоммендовал следующие правила (общий шаблон поведения с возможными отклонениями на конкретике):

    1. Необходимое уточнение: виртуальная таблица — это неявный вложенный запрос. Кроме прочего это значит, что в некоторых ситуациях лучше использовать не ее, а исходный регистр. «ОстаткиИОбороты» насколько помню преобразуются аж в три запроса к реальным данным.

    2. Не использовать соединения с вложенным запросом.

    3. Не запихивать во временную таблицу слишком много данных.

    4. Для группировки данных не класть исходные данные во временную таблицу (если эти данные не понадобятся в другом запросе пакета) — вложенный запрос работает на ура.

    5. Не выбирать и не таскать по пакету ненужные поля. Особенно неиндексированые. Если вытаскиваются только индексированные поля (особенно если только ссылка), то велик шанс, что индексы будут использованы и не потребуется обращения к таблицам данных. В противном случае сначала будут выбираться индексы, а потом по ним искаться данные в таблицах данных. А если выбираемых записей много, то движок может решить, что резона использовать индексы нет и сразу начнет шерстить данные (и будет прав).

    6. Для построителя отчетов (и возможно СКД) финальный запрос надо страться делать максимально простым. Вплоть до того, что поместить результат во временную таблицу и в финальном запросе просто оттуда читать. Но это надо смотреть по месту и опять же п.3

    Reply

  24. Особенно позабавил пункт 14. Это всё равно, что написать: «включайте мозги, когда проектируете и кодите» )))

    Reply

  25. Бесполезно про ошибки писать. Все равно только практика подскажет.

    Reply

  26. (25) kostyaomsk, лучше учиться на чужих ошибках чем на своих.

    Reply

  27. (24) Yashazz, как это не удивительно звучит, но по результатам работы с франчами, начинающими и даже некоторыми опытными спецами (возможно невнимательность или еще что-то) этот пункт достаточно актуален. Все приведенные тут примеры взяты из практики.

    Reply

  28. (20) baton_pk, в также можно задать вопрос: почему еще нет классов, наследования, инкапсуляции и др.? Думаю, что этого не будет и в 8.4, хотя эклипс вроде обещали.

    Reply

  29. (13) bonv, в какой-то момент знак <> начинает наоборот отвлекать, уже года как 3 использую в сравнениях только НЕ = и в запросах и в коде. Тренирует логическое мышление, как мне кажется.

    Reply

  30. Стараюсь придерживаться правильному подходу, принятому, но:

    1. Видел правильный хорошо выверенный код, но не решающий задачу.

    2. Видел «спагетти» кода, но работает как часы. Разобраться сложно но можно.

    Так что все относительно.

    Тут недавно показывали код некоторых модулей исходников Windows, так там используют даже GOTO!!!!

    и ничего! спор шел по-поводу целесообразности выхода из цикла ‘Break’ или ‘GoTo Метка’?

    Так вот сошлись на том, что Break, что GoTo сути не меняет, но для некоторых понятнее куда переходим из цикла при прерывании, а не просто прерываем цикл (break) и следуем далее по ходу выполнения после тела цикла!

    Как-то так…

    Reply

  31. 15. Не изобретайте велосипед

    Где бы еще найти описание функций общих модулей. Бывает и нередко, что действительно изобретаю велосипед.

    Reply

  32. 21. Испольуйте предопределенные значения в запросах. (совет, запросы)

    С пунктом 21 не согласен.

    Так как использование функций (ЗНАЧЕНИЕ() и т.п.) в запросе ведет к дополнительным преобразованиям на стороне СУБД. Соответственно, может увеличиться время исполнения запроса.

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

    p.s. кстати, буква «з» пропущена в слове ИспольЗуйте

    Reply

  33. (32) SirYozha,

    1. Плюс от такого использования в запросах — более простая читаемость кода и уменьшение количества кода

    2. Быстродействие зависит от платформы к платформе и оптимизатора 1С

    Reply

  34. (31) Painted, на ИТС есть документация библиотеки стандартных подсистем от фирмы 1С — описание использования набора универсальных функциональных подсистем, предназначенных для использования в прикладных решениях на платформе «1С:Предприятие» Стандартные библиотеки. Документация..

    Reply

  35. (23) friend0,

    1. на самом деле подобные вещи про оптимизацию запросов собирались из разных источников: настольная книга 1с: эксперта по технологическим вопросам; в интернете — на текущем сайте, других формах; про особенности работы MS SQL оптимизацию на technet.microsoft.com; в некоторых случаях проводились практические замеры.

    К примеру, индексировать временную таблицу при наличии 10 записей не эффективно.

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

    3. Вопрос: про неиспользование виртуальных таблиц — при создании запроса по реальной таблице Вы сразу вспомнили и подумали про поле активность?

    Reply

  36. (11) baton_pk,

    Можно еще проще

    Если Результат Тогда // …

    Reply

  37. (36) andrey3d, если Вы про пункт 5, то нельзя (читайте внимательнее).

    Reply

  38. (14) baton_pk,

    Можно еще использовать команды:

    < — ALT + 60;

    > — ALT + 62.

    Сам только так и делаю.

    Еще пример:

    & — ALT + 38

    Reply

  39. (38) Denis S,

    раз уж рука дотянулась до альта, то лично мне проще дважды раскладку переключить: alt+shift [] alt+shift

    цифрами я только | (alt+124) набираю и # (alt+35).

    к тому же альт+… плохо работает при работе через TeamViewer, особенно под Убунту. а если ещё ноутбук без нумпада — это вообще в ад превращается 🙂

    Reply

  40. По поводу пункта 22.1. На больших объемах данных + MS SQL очень быстро увеличиваются логи. Так как временная таблица создает физическую таблицу в базе, потом удаляет и все это пишется в логи. В случае использования вложенных таблиц будет использоватся только оперативная память. Тут уж лучше исходить из задачи.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Понравилась статья? Поделить с друзьями:
  • Типичные ошибки анализа документов это отсутствие
  • Типичные орфографические ошибки реферат
  • Типичные нормотворческие ошибки
  • Типичные недочеты и ошибки при создании презентаций
  • Типичные морфологические и синтаксические ошибки