Различные ошибки при разработке в предприятии

17.03.25

Разработка - Рефакторинг и качество кода

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

Может, я и детский лепет решила писать. Если что, извиняюсь, но просто уже "Крик души".

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

 

Типичные ошибки:

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

2. Метод объекта не обнаружен

3. Неверный параметр "ИзмеренияОсновногоРегистра" (измерение 1 не соответствует ни одному из измерений основного регистра)

4. Запись не верна! Вид субконто "ВидНоменклатуры" не доступен для данной записи (Регистр бухгалтерии: Хозрасчетный; Номер строки: 1)


Регистр расчета.

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

 

 

Если нажать  Подробно и Конфигуратор, то выкинет на соответствующий вид расчета, где и была ошибка. А теперь вчитываемся по буквам в Массив Измерений и в данные регистра, думаю, все теперь ясно.

 

 

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

 

Регистр бухгалтерии

Запись не верна! Вид субконто "ВидНоменклатуры" недоступен для данной записи (Регистр бухгалтерии: Хозрасчетный; Номер строки: 1)

 

 

Здесь типичная ошибка  платформы. И это не новинка. Слетают настройки субконто. У регистра расчета, к слову, тоже могут слетать настройки планов видов расчета. Не встала база для данного вида расчета и дело с концом. Ошибки  не вылезет, просто  результат будет  0 или null. Найти это можно только в процессе отладки.

PS: Живой пример, когда мы создаем ВидРасчета, например, Премия, который зависит от базы (оклада). Так вот, когда мы ставим базовые виды Расчета для той же Премии, они могут не встать, в итоге база Null и результата нет, либо  результат 0, если мы вооружились на нужное нам числовое поле функцией ЕстьNull(). В процессе отладки мы найдем, что база нулевая, но ведь мы в конфигураторе все настройки сделали! Но увы, и в предприятии нужно проверять.

Переходим к субконто, мы настроили в конфигураторе:

 

 

Но, о чем сказано выше, полезли в предприятии

 

 

А там пусто, в связи с чем и вылазит данная ошибка. Причем, может, предприятие скорее всего не даст создать данное субконто, так как ключ уже есть (в конфигураторе) и создать его вновь в предприятии будет дублем неуникальности. Такие ошибки нужно переделывать в конфигураторе и следить, чтоб все встало в предприятии. Или даже если  пробовать через предприятие, то в конфигураторе все равно нужно  убрать.

Поехали дальше)

Очередная молчаливая ошибка, просто пустой отчет.  Здесь нужно копать за признаки учета.

 

Мы вроде бы сделали  самый простой отчет по регистру бухгалтерии, где мы передаем &МассивСубконто и Счет = &Счет. Но у нас пусто.

Для начала посмотрим признаки учета. 

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

Заводятся они в плане счетов и определяются в целом для счета. Ставим этот признак после создания только на тех счетах, где оно нам нужно.

Есть еще Признак Учета субконто, данный признак нужен для ведения учета в разрезе субконто.

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

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

Данные признаки должны быть связаны с ресурсами регистра бухгалтерии.

Регистр сам по себе должен быть связан с планом счетов. А ресурсы нужны для связи с признаками учета.  нужно писать Количество - нужен для ресурса Количество признак учета Количественный. нужен суммовой учет в разрезе субконто, связываем  ресурс сумму с признаком учета Субконто.

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

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

Налицо  слет настроек субконто.

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

В данном случае косяк за пользовательским режимом. Настройки в предприятии не принялись, в итоге это для программы как отсутствие настройки. То есть суммовой учет типа не ведется   по контрагентам, так что мы хотим?

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

 

Регистры накопления.

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

 

 

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

 

 

Если всмотреться, то у объекта не поля Записать, есть Свойство Записывать(), который ставим в истину для того, чтобы осуществлялась запись в регистр методом Записать().

 

 

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

 

 

Итого нас выкинет через подобно на строку:

Движение.Склад = Склад;

Смотрим скриншот выше и смотрим структуру регистра, куда пишем.

То, что слева Движение... это данные регистра, то, что после знака = это данные вашего документа. В документе видим склад есть - оптовый, но в регистре где склад? Потому и ошибка.

 

 

Также хочется поговорить о привязках процедур в модулях.

 

 

Спрашивается, откуда это? Мы всего лишь нажали кнопку Добавить на форме.

Преобразование значения к типу Число не может быть выполнено
{ОбщийМодуль.Расчеты.Модуль(12)}:СтоимостьСоСкидкой = Сумма - Скидка;
{Документ.РеализацияТоваровИУслуг.Форма.ФормаДокумента.Форма(17)}:Массив = Расчеты.РассчитатьСтоимость(Элементы.Товары.ТекущиеДанные.ЦенаРеализации,Элементы.Товары.ТекущиеДанные.Количество);

[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ОшибкаИспользованияВстроенногоЯзыка]

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

В данном случае мы при изменении табличной части уже обратились к подсчету себестоимости для... расчета данных о товаре, который еще не внесен. В данном случае у нас  значение отсутствует,  без типа данных это Null.  Поэтому выскакивает  данная ошибка.  Null это отсутствие значения, которое непонятно даже платформе.  То есть расчет  стоимости и скидки мы делаем ПриИзменении() соответствующих полей, но тут оно излишне, это вариант как в каждую бочку затычка, но лучше взвешивать подобное. 

 

 

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

 

 

Проверяем.. На форме имя правильное, в объекте тоже:

 

 

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

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

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

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

 

Настройки Сервер, Клиент, ВызовСервера, Экспортные функции

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

 

 

Как это не вызвать? Полезли в общий модуль.

 

 

Галки Сервер и вызов сервера есть. Если стоит Сервер и клиент, то писала выше, что на начальном этапе изучения лучше делить. В Типовых совмещают, но как.. рано или поздно может поймем, но  пока лучше по отдельности изучать для понимания.

Итого галки все  нужные стоят, переменные по порядку  сделаны как надо.. А... Мы для вызова процедуры из общего модуля забыли её сделать экспортной. То есть по сути в общих модулях мы ставим процедуры экспортными, чтоб к ним обращаться с любого места и не кодить в каждой справке/документе один и тот же код. Прописываем ЭКСПОРТ

Это как минимум тех ошибок, которые просматриваешь каждый день, помимо  своей Итоговой работы. Но куда ж без помощи студентам)))

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Рефакторинг и качество кода Разработчик 1С 8.3 1С 8.5 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Знакомая последовательность. Внешний отчет на СКД: модуль объекта на две тысячи строк, девять текстов запросов, три набора данных со связями. Переделываю под другую базу, собираю ERF, прогоняю пакетную проверку конфигуратором, чисто. Отдаю. Через двадцать минут приходит скриншот: «Переменная не определена». Правлю, пересобираю, отдаю. Через двадцать минут второй: «Не задано значение параметра». Два круга через живого человека ради двух ошибок, каждая из которых воспроизводится на той же машине за три секунды. Если знать, чем ее воспроизводить. Воспроизводит ее COM-коннектор, и дальше вся статья про то, как из него собрать проверку, которая умеет падать.

вчера в 17:50    214    KonMa    0    

2

Рефакторинг и качество кода Разработчик 1С 8.3 1С:Управление торговлей 11 Россия Бесплатно (free)

8 приёмов за 10 минут: перестаньте прокручивать общий модуль на три тысячи строк как ленту в соцсети. Outline, #Область и фильтр - и вы уже в нужной процедуре, а не на строке «где-то внизу».

25.09.2026    1455    aleksandrboldyusov    6    

15

Перенос данных 1C Рефакторинг и качество кода Разработчик 1С 8.3 Бесплатно (free)

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

24.09.2026    379    nedomolkov.ivan    0    

0

Рефакторинг и качество кода Обновление 1С Разработчик 1С 8.3 Бесплатно (free)

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

22.09.2026    537    1c-izh    0    

5

Рефакторинг и качество кода Тестирование QA Разработчик Бесплатно (free)

Штатная страховка внутри цепочки обработки умеет прятать дефекты того шага, который стоит перед ней. У нас так и вышло: валидатор чинил результат постфактум, на выходе всё выглядело корректно, и никто не видел, что предыдущий шаг молча теряет данные. Вылезло это только на независимой проверке чужими глазами. Разбираю, чем инвариант отличается от сценарного теста и почему обычное умножение вытащило дефект из красивой метрики 0,997. Отдельно про 13 дублей, которые приехали из источника ещё до всякой обработки, и про две находки, которые оказались вообще не моими: они жили в эталонной реализации, откуда я списывал логику. Вторая часть про лимит выхода модели: почему обрезка ответа по длине это тихий ноль в мониторинге и как смена формата на дельты уронила выход до 4 951 токена. Есть отклонённые гипотезы и честный список того, чего мы так и не померили.

21.09.2026    443    nedomolkov.ivan    2    

1

WEB-интеграция Рефакторинг и качество кода Системный администратор Разработчик 1С 8.3 Бесплатно (free)

Я сел проверять внутренний поисковый сервис по коду: можно ли доверять ему в автоматическом режиме. Сверка с обычным текстовым поиском по файлам дала 261 из 261, 264 из 264 и 182 из 182 совпадений, разбор структуры файла - 318 функций из 318. Стопроцентная точность. Этот же замер и вскрыл, что опираться на сервис нельзя: искал он безупречно, только совсем не в том месте, которое я ему называл. Внутри разбор трёх дефектов, сложившихся в один тихий отказ: аргумент, проглоченный без ошибки; умолчание, выставленное когда-то наугад; снимок данных, у которого в ответе не указан возраст. Плюс регулярное задание, которое вся команда считала работающим и которого не существовало никогда. Перенос на 1С прилагается: готовый цикл проверки, после которого HTTP-сервис перестаёт молча принимать мусор.

21.09.2026    443    nedomolkov.ivan    0    

0

Логистика, склад и ТМЦ Рефакторинг и качество кода Разработчик Аналитик Руководитель проекта 1С 8.3 Бесплатно (free)

Кладовщик получает задачу: на складе проверки лежат две штуки. Идёт в зону, а там всё на месте и никакой задачи в складской системе нет. Так работала автоматическая сверка остатков между учётной и складской системами: разницу она переносила документом, а комментарий к этому документу восемь месяцев отправлял людей искать несуществующий ноль. Робота разобрали до кода. Обе сравниваемые величины оказались синтетическими: слева физический срез с вычетами по активности и окнами в 60 минут и 12 часов, справа учётный остаток на конец дня минус трёхчасовой хвост непроведённых ордеров. Порог срабатывания стоял в нуле, поэтому робот исправно оформлял собственный шум измерения: за 60 дней он сам создал 62,7% оборота технического склада, а 2 081 артикул из 2 102 приезжал туда и уезжал обратно. Внутри обе формулы, замер лага отгрузки, снятая гипотеза и честная граница данных.

21.09.2026    455    nedomolkov.ivan    2    

0
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Восьмой 101 18.03.25 14:01 Сейчас в теме
Молодец Лен, так держать!
2. nuctoh 31 18.03.25 22:43 Сейчас в теме
Извините, но это разраб со стажем в месяц орет с разраба со стажем в неделю.
PS: NULL это не пустое значение, а отсутствие значения в БД.
jump0; Bukaska; chrnv; +3 – Ответить
3. Bukaska 159 19.03.25 18:32 Сейчас в теме
(2) Спасибо за замечание. Исправила. Каждый понимает по разному. Главное понимать, как с этим работать. Отрицательный результат тоже результат, даже если толком ничего не понятно и неизвестно.
4. nuctoh 31 19.03.25 22:39 Сейчас в теме
(3) Спасибо, конечно, за исправление, только оно некорректно )) Null вполне понятен и платформе и должен быть понятен разработчику. Null это отсутствие записи в БД. Так что если какая-то функция возвращает null, к примеру ПолучитьЦенуНоменклатуры, то этот null можно трактовать как отсутствие цены в регистре ЦеныНоменклатуры и сообщить пользователю.
Но предыдущий мой коммент посвящен вовсе не null, а довольно наивному и с ошибками решению простой задачи расчета суммы в строке товаров. И там целый ворох косяков:
1. Ошибка. Нет проверки на Неопределено у Элементы.Товары.ТекущиеДанные. При удалении строки или очистке таблицы событие Товары.ПриИзменении тоже выстреливает. В пустой таблице выделенной строки нет, так что вылетит ошибка.
2. Нет нужды каждый раз пересчитывать сумму при изменении любого поля у ТЧ. Гораздо правильней потрудиться и повесить расчет на события ТоварыЦенаПриИзменении и прочие, от которых может зависеть сумма. Во-первых, при расчете сумм (особенно со скидками, как в примере) может быть сложный расчет, дергающий БД, а зачем нам лишний серверный вызов, если мы просто хотим коммент в строке приписать? Во-вторых, это в нашем ванильном примере пять строк исполняются мгновенно, а когда вы дорастёте до ERP с процедурами по несколько сот строк, размазанных по модулям, то отзывчивости некомпилируемому языку 1С это не добавит.
3. Если уж мы возвращаем некий сложный набор данных как в случае функции РассчитатьСтоимость, то зачем массив с фикс данными? Чтобы разработчик не догадался что в нем за данные, когда отладчиком будет бежать? Или чтобы получить непонятную ошибку Элемент по индексу не определен, если кто-то криво изменит нашу функцию? Почему не вернуть структуру с полями Сумма, Скидка и СтоимостьСоСкидкой?
4. Зачем вообще &клиентская РассчитатьСтоимость нам чтото возвращает? Мы можем объявить ее процедурой без параметров и в ней получая текущие данные строки рассчитать стоимость и сразу же поместить в соотв поля. Так вы замените 4 строки в каждом событии ТоварыПолеПриИзменении (а их наверно будет минимум три - для полей Количество, Цена и Скидка) на одну, сэкономите себе 9 строк кода и, главное, поместите всю логику в одно место.
5. Зачем объявлять эту функцию экспортируемой? Экспортируемой нужно делать только процеруры, вызываемые обработчиками ожиданий. Нет, конечно, если вы получили где-то во внешнем модуле форму документа и программно добавляете в нее строки и считаете суммы, то экспортировать надо. Но этот стиль называется "макаронная фабрика". Если уж надо отправить в форму какие-то данные и их обработать, то лучше воспользоваться событием ОбработкаОповещения формы и соответственно методом Оповестить во внешнем модуле.

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

В общем, успехов вам в изучении 1С и движения по карьере. Но торопитесь! Код такого качества уже выдает любая передовая нейросетка типа deepseek, qwen или простихоспади chatgpt!
5. Bukaska 159 20.03.25 09:48 Сейчас в теме
(4) Я пишу про те студенческие реалии, что сама каждый день вижу. Они могут быть неоптимальны, но сделаны для того, чтоб студент познавал механизмы для понятия. Здесь указаны вещи, что допускают студенты сплошь и рядом. Важно чтоб студент понимал, где ошибка и почему, а не кричал в учебном чате умывая руки. Базы временами, что черт ногу сломит, это еще цветочки. В общем я вроде пояснила ситуацию.
6. magic1s 12 19.06.25 05:03 Сейчас в теме
Чего хоть студенты?
Где преподаете?
7. Bukaska 159 19.06.25 09:54 Сейчас в теме
(6) Я не преподаю, я только помогаю студентам. Сама уже закончила курс.
Для отправки сообщения требуется регистрация/авторизация