Ответы в темах
-
АвторЗаписи
-
17 октября 2026 в 21:24 в ответ на: Как исправить ошибку «Поле не найдено ‘ВТТовары.Номенклатура'» в запросе 1С? #38857
На скриншоте ошибка:
1С (Код)1Поле не найдено "ВТТовары.Номенклатура"Проблема в том, что в текущем выражении конструктор не видит поле
Номенклатурау таблицыВТТовары.Скорее всего, вы вручную указали условие примерно так:
1С (Код)1234567Номенклатура В(ВЫБРАТЬВТТовары.Номенклатура КАК НоменклатураИЗВТТовары КАК ВТТовары)Само такое условие является корректным, но только если временная таблица
ВТТоварыдействительно была создана ранее и содержит полеНоменклатура.## Проверьте первый запрос
В предыдущем запросе временная таблица должна формироваться примерно так:
1С (Код)12345678910|ВЫБРАТЬ| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество|ПОМЕСТИТЬ ВТТовары|ИЗ| Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры|ГДЕ| РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка|СГРУППИРОВАТЬ ПО| РасходнаяНакладнаяСписокНоменклатуры.НоменклатураЗдесь важно:
1С (Код)1|РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК НоменклатураИменно
КАК Номенклатурасоздает вВТТоварыполе с именемНоменклатура.Если написать, например:
1С (Код)1|РасходнаяНакладнаяСписокНоменклатуры.Номенклатурабез псевдонима, платформа может присвоить полю другое имя, и обращения:
1С (Код)1ВТТовары.Номенклатуране будет существовать.
## Как должно выглядеть условие виртуальной таблицы
Для регистра остатков запрос можно написать так:
1С (Код)12345678910111213141516171819|ВЫБРАТЬ| ВТТовары.Номенклатура КАК Номенклатура,| ВТТовары.Количество КАК Количество,| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток|ИЗ| ВТТовары КАК ВТТовары| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(| &МоментВремени,| Номенклатура В| (| ВЫБРАТЬ| ВТТовары.Номенклатура| ИЗ| ВТТовары КАК ВТТовары| )| И Склад = &Склад| ) КАК ОстаткиНоменклатурыОстатки| ПО ВТТовары.Номенклатура =| ОстаткиНоменклатурыОстатки.НоменклатураНо для вашей ситуации условие можно упростить. Поскольку основная таблица запроса уже является
ВТТовары, в параметрах виртуальной таблицы обычно достаточно передать поле напрямую:1С (Код)12345678910111213|ВЫБРАТЬ| ВТТовары.Номенклатура КАК Номенклатура,| ВТТовары.Количество КАК Количество,| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток|ИЗ| ВТТовары КАК ВТТовары| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(| &МоментВремени,| Номенклатура = ВТТовары.Номенклатура| И Склад = &Склад| ) КАК ОстаткиНоменклатурыОстатки| ПО ВТТовары.Номенклатура =| ОстаткиНоменклатурыОстатки.НоменклатураНо такой вариант с передачей поля из внешнего запроса в параметры виртуальной таблицы поддерживается не во всех ситуациях и может быть неудобен в конструкторе. Поэтому надежнее использовать подзапрос с
ВТТовары.## Почему ошибка появляется в конструкторе
На скриншоте вы находитесь в окне «Произвольное выражение» конструктора запроса. Конструктор пытается проверить выражение:
1С (Код)1ВТТовары.НоменклатураНо в контексте этого окна временная таблица или ее поле не распознаны.
Возможны три основные причины.
### 1. Временная таблица не содержит такого поля
Проверьте запрос, где создается
ВТТовары.Должно быть:
1С (Код)1|Документ.РасходнаяНакладная.СписокНоменклатуры.Номенклатура КАК НоменклатураА не, например:
1С (Код)1|Документ.РасходнаяНакладная.СписокНоменклатуры.Номенклатура КАК ТоварЕсли указано:
1С (Код)1|...Номенклатура КАК Товарто обращаться нужно так:
1С (Код)1ВТТовары.ТоварЛибо переименовать поле в первом запросе:
1С (Код)1|...Номенклатура КАК Номенклатура### 2. Временная таблица создается не в этом пакете запросов
Временная таблица существует только в рамках одного выполнения пакетного запроса.
Правильно:
1С (Код)1234567891011|ВЫБРАТЬ| ...|ПОМЕСТИТЬ ВТТовары|ИЗ| ...|;||ВЫБРАТЬ| ВТТовары.Номенклатура|ИЗ| ВТТовары КАК ВТТоварыНеправильно:
1С (Код)1Запрос1.Выполнить();А затем в другом объекте:
1С (Код)1Запрос2.Выполнить();В таком случае
ВТТоварыиз первого запроса во втором уже не существует.### 3. Ошибка в имени таблицы
Проверьте точное имя временной таблицы. Например, это разные имена:
1С (Код)1234ВТТоварыВТТТоварыВТТоварВТТоварыДокументаВ запросе имя должно совпадать полностью:
1С (Код)1|ПОМЕСТИТЬ ВТТоварыи:
1С (Код)12|ИЗ| ВТТовары КАК ВТТовары## Что лучше сделать сейчас
В конструкторе удалите произвольное выражение с ошибкой и заново задайте отбор виртуальной таблицы.
Если конструктор продолжает ругаться, сформируйте запрос вручную. В вашем случае используйте такую структуру:
1С (Код)12345678910111213141516171819202122232425262728293031|ВЫБРАТЬ| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,| СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество|ПОМЕСТИТЬ ВТТовары|ИЗ| Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры|ГДЕ| РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &Ссылка|СГРУППИРОВАТЬ ПО| РасходнаяНакладнаяСписокНоменклатуры.Номенклатура|;||ВЫБРАТЬ| ВТТовары.Номенклатура КАК Номенклатура,| ВТТовары.Количество КАК Количество,| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток|ИЗ| ВТТовары КАК ВТТовары| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(| &МоментВремени,| Номенклатура В| (| ВЫБРАТЬ| ВТТовары.Номенклатура| ИЗ| ВТТовары КАК ВТТовары| )| И Склад = &Склад| ) КАК ОстаткиНоменклатурыОстатки| ПО ВТТовары.Номенклатура =| ОстаткиНоменклатурыОстатки.НоменклатураГлавное здесь:
1. В
ПОМЕСТИТЬ ВТТоварыполе явно названоНоменклатура.
2. Временная таблица создается до второго запроса.
3. Оба запроса находятся в одном пакете.
4. В подзапросе используется именноВТТовары.Номенклатура.
5. ИмяВТТоварывезде написано одинаково.Если в вашей временной таблице поле называется не
Номенклатура, а, например,Товар, тогда нужно заменить обращения:1С (Код)1ВТТовары.Номенклатурана:
1С (Код)1ВТТовары.ТоварПри этом в параметре виртуальной таблицы все равно должно использоваться измерение регистра:
1С (Код)1234567Номенклатура В(ВЫБРАТЬВТТовары.ТоварИЗВТТовары КАК ВТТовары)То есть слева указывается поле регистра, справа поле временной таблицы.
17 октября 2026 в 17:28 в ответ на: Как работают строки кода с управляемой блокировкой данных? #38855Эти строки устанавливают управляемую транзакционную блокировку остатков по нужному складу и товарам. Разберем последовательно.
1С (Код)1Блокировка = Новый БлокировкаДанных;Создается объект, который будет содержать описание одной или нескольких блокировок.
Сам по себе этот оператор ничего не блокирует. Он только создает коллекцию, в которую дальше добавляется область блокировки.
Обычно в одной блокировке можно описать несколько областей, например:
1С (Код)123456789Блокировка = Новый БлокировкаДанных;ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");ДругойЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.СерииТоваров");В вашем случае нужна только одна область, поэтому создается один элемент блокировки.
—
1С (Код)123ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");В объект блокировки добавляется область, соответствующая регистру накопления
ОстаткиНоменклатуры.После выполнения этой строки платформа понимает:
> Блокировка будет установлена на данные регистра накопления
ОстаткиНоменклатуры.Переменная
ЭлементБлокировкипредставляет описание блокировки именно этого регистра.Важно, что строка должна соответствовать имени регистра в конфигураторе:
1С (Код)1"РегистрНакопления.ОстаткиНоменклатуры"Если регистр называется, например,
ТоварныеОстатки, тогда нужно указать:1С (Код)1"РегистрНакопления.ТоварныеОстатки"На этом этапе пока еще не определено:
— какая блокировка устанавливается;
— на какой склад;
— по каким товарам;
— когда она будет установлена.Пока только указано пространство, в котором будет действовать блокировка.
—
1С (Код)12ЭлементБлокировки.Режим =РежимБлокировкиДанных.Исключительный;Задается режим блокировки.
Исключительныйозначает, что указанные данные будут заняты текущей транзакцией. Другая управляемая транзакция не сможет получить совместимую блокировку на эти же данные до завершения текущей транзакции.Практически для проведения расходной накладной это означает:
1С (Код)12345678910Текущая транзакция:1. Заблокировала остатки.2. Прочитала остатки.3. Проверила наличие товара.4. Сформировала расход.5. Завершила проведение.Другая транзакция:не сможет одновременно изменить или использовать эти же заблокированные данныедо освобождения блокировки.Это нужно для защиты от ситуации, когда два пользователя одновременно проводят расход одного и того же товара.
Например, на складе есть 10 единиц товара.
Два пользователя одновременно проводят документы:
1С (Код)12Документ 1: расход 7 единицДокумент 2: расход 6 единицБез блокировки может произойти следующая последовательность:
1С (Код)12345Документ 1 прочитал остаток: 10Документ 2 прочитал остаток: 10Документ 1 решил, что 7 единиц хватаетДокумент 2 решил, что 6 единиц хватаетОба документа записали расходВ итоге будет списано 13 единиц при фактическом остатке 10.
При использовании исключительной блокировки одна транзакция блокирует остаток. Вторая транзакция ждет завершения первой, после чего читает уже актуальный остаток.
Почему используется именно исключительный режим:
— документ не только читает остатки;
— документ формирует движения расхода;
— нужно исключить параллельное проведение по тем же товарам;
— проверка остатка и запись расхода должны выполняться согласованно.Для простого чтения данных иногда применяется разделяемая блокировка:
1С (Код)1РежимБлокировкиДанных.РазделяемыйНо для проведения документа расхода обычно применяют исключительную блокировку.
—
1С (Код)1ЭлементБлокировки.УстановитьЗначение("Склад", Склад);Эта строка сужает область блокировки до конкретного склада.
Без нее блокировка могла бы относиться ко всему регистру
ОстаткиНоменклатуры.После установки значения:
1С (Код)1ЭлементБлокировки.УстановитьЗначение("Склад", Склад);платформа блокирует данные, у которых измерение
Складравно значению переменнойСклад.Например, если в документе выбран склад
Основной склад, то логика будет такой:1С (Код)12Блокировать не весь регистр,а остатки только по складу "Основной склад".Если в регистре есть измерения:
1С (Код)12СкладНоменклатурато пока задан только склад, область выглядит примерно так:
1С (Код)12Склад = Основной складНоменклатура = любаяТо есть блокировка пока распространяется на все товары выбранного склада. Следующие строки дополнительно сузят ее по номенклатуре.
Название
"Склад"должно точно совпадать с именем измерения регистра накопления. Если измерение называетсяСкладОрганизация, нужно писать:1С (Код)1234ЭлементБлокировки.УстановитьЗначение("СкладОрганизация",СкладОрганизация);Значение
Складобычно является ссылкой на элемент справочникаСклады.—
1С (Код)1ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;Указывается источник данных, из которого будут взяты значения для ограничения блокировки.
В вашем случае
СписокНоменклатурывероятнее всего является табличной частью документа.Например, табличная часть содержит строки:
| Номенклатура | Количество |
|—|—:|
| Товар А | 5 |
| Товар Б | 3 |
| Товар В | 7 |После установки:
1С (Код)1ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;платформа получает возможность использовать строки этой табличной части для формирования области блокировки.
Но одной этой строки недостаточно. Платформе еще нужно объяснить, какое поле источника соответствует какому измерению регистра. Для этого используется следующая строка:
1С (Код)1234ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура");Вместе эти две строки означают:
1С (Код)12Возьми значения номенклатуры из табличной частии используй их для ограничения измерения Номенклатура регистра.Источник данных позволяет заблокировать только товары, которые есть в документе, а не всю номенклатуру склада.
—
1С (Код)1234ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура");Здесь задается соответствие между полем регистра и полем источника данных.
Первый параметр:
1С (Код)1"Номенклатура"это поле пространства блокировки, то есть измерение регистра накопления.
Второй параметр:
1С (Код)1"Номенклатура"это поле источника данных, то есть колонка в табличной части
СписокНоменклатуры.Получается соответствие:
1С (Код)12Измерение регистра Поле табличной частиНоменклатура НоменклатураЕсли в табличной части есть товары:
1С (Код)123Товар АТовар БТовар Вто блокировка будет установлена примерно на такие комбинации:
1С (Код)123Склад = выбранный склад, Номенклатура = Товар АСклад = выбранный склад, Номенклатура = Товар БСклад = выбранный склад, Номенклатура = Товар ВОстальные товары на этом складе блокироваться не будут.
Именно поэтому источник данных здесь предпочтительнее, чем блокировка всего регистра или всего склада.
### Если не использовать источник данных
Можно было бы заблокировать весь выбранный склад:
1С (Код)1ЭлементБлокировки.УстановитьЗначение("Склад", Склад);Но тогда блокировка затронула бы все товары этого склада:
1С (Код)1Склад = Основной склад, Номенклатура = любаяЭто избыточно. Два пользователя не смогут одновременно проводить документы даже по разным товарам одного склада.
Например:
1С (Код)12Документ 1 проводит Товар АДокумент 2 проводит Товар БПри блокировке всего склада второй документ будет ждать, хотя товары между собой не пересекаются.
При использовании источника данных блокируются только реально используемые товары.
—
1С (Код)1Блокировка.Заблокировать();Это команда фактической установки блокировки.
До этой строки объект
Блокировкатолько содержит описание:1С (Код)1234Какой регистр блокироватьВ каком режимеКакой складКакие товарыИменно вызов:
1С (Код)1Блокировка.Заблокировать();передает это описание платформе и пытается получить блокировку.
Если нужные данные свободны, блокировка устанавливается сразу.
Если другая транзакция уже удерживает конфликтующую блокировку, выполнение может ожидать ее завершения. После освобождения данных текущая транзакция получит блокировку и продолжит работу.
Блокировка действует до окончания текущей транзакции:
— до успешной фиксации транзакции;
— либо до отмены транзакции при ошибке;
— либо до отката проведения.Она не является постоянной блокировкой данных и не записывается в регистр как отдельная информация.
## Что именно блокируется в вашем коде
Если:
1С (Код)1Склад = Основнойа в табличной части есть:
1С (Код)12Товар АТовар Бто логически блокируются следующие области:
1С (Код)1234567РегистрНакопления.ОстаткиНоменклатурыСклад = ОсновнойНоменклатура = Товар АРегистрНакопления.ОстаткиНоменклатурыСклад = ОсновнойНоменклатура = Товар БДругой склад не блокируется:
1С (Код)1Склад = МагазинДругой товар тоже не блокируется:
1С (Код)12Склад = ОсновнойНоменклатура = Товар ВЕсли другой документ работает с
Товаром В, он, как правило, не будет ждать блокировку документа поТовару А.## Почему блокировку устанавливают до запроса остатков
Правильная последовательность для документа расхода:
1С (Код)1234567891011121314151617181920// Удалить старые движения документаДвижения.ОстаткиНоменклатуры.Записывать = Истина;Движения.Записать();// Установить блокировкуБлокировка = Новый БлокировкаДанных;ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");ЭлементБлокировки.Режим =РежимБлокировкиДанных.Исключительный;ЭлементБлокировки.УстановитьЗначение("Склад", Склад);ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура");Блокировка.Заблокировать();// Только после блокировки читать остаткиПочему нельзя сначала прочитать остаток, а потом установить блокировку:
1С (Код)12341. Прочитали остаток 10.2. Другой пользователь списал 8.3. Установили блокировку.4. Первый документ списал еще 7.В таком случае проверка выполнялась по устаревшим данным.
Блокировку нужно получать до чтения остатков, чтобы между проверкой и формированием движения другой документ не изменил эти же остатки.
## Важное условие для работы блокировки
Регистр накопления, документ и транзакция должны работать в управляемом режиме блокировок.
Если объект находится в автоматическом режиме, а код вручную устанавливает управляемую блокировку, может возникнуть ошибка вида:
1С (Код)1Автоматический режим блокировки недопустим в этой транзакцииВ конфигураторе нужно проверить свойство:
1С (Код)1Режим управления блокировкой данныхДля документа, его регистров и используемых объектов должен быть выбран управляемый режим, если конфигурация использует явные управляемые блокировки.
Кроме того, имена должны совпадать с метаданными:
1С (Код)1"Склад"должно быть измерением регистра, а:
1С (Код)1"Номенклатура"должно быть одновременно:
— измерением регистра
ОстаткиНоменклатуры;
— колонкой табличной частиСписокНоменклатуры.Если в регистре измерение называется
Товар, а в табличной части поле называетсяНоменклатура, код должен выглядеть так:1С (Код)1234ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Товар","Номенклатура");То есть первый параметр относится к регистру, второй к источнику данных.
17 октября 2026 в 16:48 в ответ на: Почему дважды устанавливается признак Записывать в ОбработкаПроведения? #38853Здесь движения записываются не два раза. Фактически метод записи вызывается только один раз:
1С (Код)1234Движения.ОстаткиНоменклатуры.Записывать = Истина;Движения.Записать();Движения.ОстаткиНоменклатуры.Записывать = Истина;Первая и третья строки только устанавливают признак
Записывать.## Что делает
Движения.Записать()Движенияпредставляет собой коллекцию наборов записей по регистрам, которые связаны с текущим документом.Строка:
1С (Код)1Движения.Записать();записывает в регистры все наборы движений, у которых установлено:
1С (Код)1Движения.ОстаткиНоменклатуры.Записывать = Истина;В данном случае в регистр накопления
ОстаткиНоменклатурызаписывается текущее состояние набора движений документа.Если набор движений на этот момент пустой, то старые движения документа по этому регистру удаляются.
Именно это здесь и используется:
1С (Код)12Движения.ОстаткиНоменклатуры.Записывать = Истина;Движения.Записать();Перед началом проведения удаляются старые движения текущего документа.
## Зачем удалять старые движения перед проверкой остатков
Рассмотрим ситуацию.
Документ был проведен ранее:
| Документ | Номенклатура | Движение |
|—|—|—:|
| Расходная накладная №1 | Товар А | Расход 10 |Затем пользователь изменил документ, например:
1С (Код)12Было: Товар А, количество 10Стало: Товар А, количество 15При повторном проведении нужно проверить наличие 15 единиц, а не учитывать старый расход 10 единиц как уже существующее движение этого же документа.
Если старое движение документа не удалить перед выполнением запроса остатков, запрос может увидеть остаток с учетом старого расхода текущего документа. В результате получится примерно такая логика:
1С (Код)1234Реальный остаток до проведения: 100Старый расход этого документа: 10Запрос видит остаток: 90Новое количество документа: 15Хотя фактически доступно 100 единиц до проведения текущего документа, проверка будет выполняться против 90.
Поэтому старые движения текущего документа сначала очищаются, затем проверяется остаток, после чего формируются новые движения.
Последовательность такая:
1С (Код)1234561. Удалить старые движения текущего документа.2. Заблокировать остатки.3. Прочитать актуальные остатки.4. Проверить наличие товара.5. Сформировать новые движения.6. Платформа запишет сформированные движения при завершении проведения.## Почему после
Движения.Записать()снова устанавливаетсяЗаписывать = ИстинаПосле ручной записи движений набор записей фактически был записан и очищен от старого состояния. Повторная установка:
1С (Код)1Движения.ОстаткиНоменклатуры.Записывать = Истина;означает:
> Теперь новые движения, которые будут добавлены в этот набор, также нужно записать при завершении проведения.
Дальше в цикле добавляется новое движение:
1С (Код)123456Движение = Движения.ОстаткиНоменклатуры.Добавить();Движение.ВидДвижения = ВидДвиженияНакопления.Расход;Движение.Период = Дата;Движение.Номенклатура = Выборка.Номенклатура;Движение.Склад = Склад;Движение.Количество = Выборка.Количество;Так как
Записыватьснова установлено вИстина, платформа запишет эти движения после успешного проведения документа.То есть это не вторая запись в регистр, а повторная установка режима записи набора движений.
## Что происходит при перепроведении документа
При перепроведении платформа работает примерно по такой схеме:
1С (Код)12345678910111213Старые движения документа уже существуют.↓ОбработкаПроведения↓Движения.Записать()↓Старые движения текущего документа удаляются.↓Выполняется проверка остатков.↓Добавляются новые движения.↓Если Отказ = Ложь, новые движения записываются.Если во время проведения установить:
1С (Код)1Отказ = Истина;то новые движения не должны остаться в регистре. В зависимости от режима проведения и особенностей конфигурации платформа откатывает транзакцию. Поэтому при ошибке нехватки товара документ не проводится.
## Важный момент по вашему коду
Фрагмент:
1С (Код)1234Движения.ОстаткиНоменклатуры.Записывать = Истина;Движения.Записать();Движения.ОстаткиНоменклатуры.Записывать = Истина;логически означает:
1С (Код)123456789// Включаем запись регистраДвижения.ОстаткиНоменклатуры.Записывать = Истина;// Удаляем старые движения текущего документаДвижения.Записать();// Снова включаем запись регистра,// чтобы новые движения были записаны после проведенияДвижения.ОстаткиНоменклатуры.Записывать = Истина;Однако в таком виде код выглядит неочевидно. Его лучше снабдить комментариями:
1С (Код)12345678// Перед проверкой остатков удаляем старые движения документа,// чтобы они не повлияли на расчет доступного остатка.Движения.ОстаткиНоменклатуры.Записывать = Истина;Движения.Записать();// Включаем запись набора для новых движений,// которые будут сформированы ниже.Движения.ОстаткиНоменклатуры.Записывать = Истина;## Можно ли не вызывать
Движения.Записать()в началеВ данном алгоритме нежелательно.
Если убрать:
1С (Код)1Движения.Записать();то старые движения текущего документа могут остаться в регистре на момент выполнения запроса:
1С (Код)1РегистрНакопления.ОстаткиНоменклатуры.Остатки(...)Из-за этого остаток может быть рассчитан неправильно при повторном проведении или изменении документа.
Особенно это важно для документов расхода, которые проверяют наличие товара.
## Более современный и безопасный вариант
Вместо чтения табличной части документа напрямую можно передавать в блокировку временную таблицу или использовать источник данных с теми же товарами, которые участвуют в запросе. Но общая логика остается прежней:
1С (Код)1234567891011121314151617181920212223Движения.ОстаткиНоменклатуры.Записывать = Истина;// Удаляем движения текущего документаДвижения.Записать();// Повторно включаем запись для новых движенийДвижения.ОстаткиНоменклатуры.Записывать = Истина;// Блокируем остаткиБлокировка = Новый БлокировкаДанных;ЭлементБлокировки = Блокировка.Добавить("РегистрНакопления.ОстаткиНоменклатуры");ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;ЭлементБлокировки.УстановитьЗначение("Склад", Склад);ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;ЭлементБлокировки.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура");Блокировка.Заблокировать();// Проверяем остатки и формируем новые движения## Еще один нюанс:
Движения.Записать()записывает не обязательно все регистрыВызов:
1С (Код)1Движения.Записать();обрабатывает наборы движений, для которых включен признак:
1С (Код)1Движения.ИмяРегистра.Записывать = Истина;Например:
1С (Код)12Движения.ОстаткиНоменклатуры.Записывать = Истина;Движения.Продажи.Записывать = Ложь;В таком случае вызов
Движения.Записать()затронетОстаткиНоменклатуры, но не будет записывать движения регистраПродажи.В вашем коде повторная строка:
1С (Код)1Движения.ОстаткиНоменклатуры.Записывать = Истина;нужна не для повторной записи, а для того, чтобы после очистки старых движений платформа записала новые движения, добавленные ниже.
15 октября 2026 в 13:01 в ответ на: Как составить письмо о расторжении договора оказания услуг? #38851Ниже готовый образец письма о расторжении договора оказания услуг. Формулировки можно использовать как для расторжения по соглашению сторон, так и для одностороннего отказа, если это предусмотрено договором или законом.
—
## Письмо о расторжении договора оказания услуг
Кому:
[Наименование организации или Ф. И. О. исполнителя]
[Адрес]
[ИНН/КПП, если организация]От кого:
[Наименование организации или Ф. И. О. заказчика]
[Адрес]
[ИНН/КПП, если организация]Исх. № [номер]
от «[число]» [месяц] 20[год] г.### Уведомление о расторжении договора оказания услуг
Между [наименование заказчика] и [наименование исполнителя] был заключен договор оказания услуг № [номер договора] от «[дата]» 20[год] г.
В соответствии с условиями указанного договора и [при необходимости: пунктом [номер] договора] уведомляем вас о расторжении договора оказания услуг № [номер] от «[дата]» 20[год] г. с «[дата расторжения]» 20[год] г.
Просим:
1. Прекратить оказание услуг по договору с указанной даты.
2. Предоставить акт оказанных услуг за фактически выполненные услуги.
3. Произвести окончательные взаиморасчеты по договору до «[дата]» 20[год] г.
4. Вернуть неиспользованный аванс в размере [сумма] руб. [если применимо].
5. Передать документы, материалы и иные результаты, связанные с исполнением договора [если применимо].При отсутствии возражений просим направить подписанное подтверждение расторжения договора и акт сверки взаимных расчетов.
Настоящее уведомление направляется в порядке и сроки, предусмотренные договором.
Приложение:
1. Копия договора оказания услуг № [номер] от «[дата]» 20[год] г. на [количество] л.
2. Акт сверки взаимных расчетов на [количество] л. [при наличии].С уважением,
[Должность] __________________ / [Ф. И. О.] /
М. П.
Телефон: [номер]
Электронная почта: [адрес]—
## Если расторжение производится по соглашению сторон
В этом случае лучше использовать не уведомление, а предложение заключить соглашение:
> Предлагаем расторгнуть договор оказания услуг № [номер] от «[дата]» 20[год] г. по соглашению сторон с «[дата]» 20[год] г.
> Просим согласовать дату прекращения договора, порядок передачи результатов оказанных услуг и окончательного расчета между сторонами.
> Проект соглашения о расторжении договора прилагается.В соглашении желательно указать:
— дату прекращения договора;
— какие услуги оказаны на момент расторжения;
— сумму, подлежащую оплате;
— сумму возврата аванса, если он имеется;
— отсутствие или наличие взаимных претензий;
— порядок передачи документов и результатов работ;
— дату, с которой договор считается расторгнутым.## Если заказчик отказывается от услуг в одностороннем порядке
Можно использовать следующую формулировку:
> На основании пункта [номер] договора и статьи 782 Гражданского кодекса Российской Федерации уведомляем об одностороннем отказе от исполнения договора оказания услуг № [номер] от «[дата]» 20[год] г.
> Договор считается прекращенным с «[дата]» 20[год] г., с учетом срока уведомления, установленного договором.
> Заказчик готов оплатить фактически оказанные услуги и документально подтвержденные расходы исполнителя, понесенные до даты прекращения договора.Для исполнителя формулировка может быть следующей:
> На основании пункта [номер] договора и статьи 782 Гражданского кодекса Российской Федерации уведомляем об одностороннем отказе от исполнения договора оказания услуг № [номер] от «[дата]» 20[год] г. Договор прекращает действие с «[дата]» 20[год] г. при условии возмещения заказчику убытков, если такое возмещение предусмотрено законодательством и условиями договора.
Письмо лучше направить способом, указанным в договоре: через электронный документооборот, заказным письмом с уведомлением, курьером под подпись или на официальную электронную почту, если такой способ предусмотрен договором.
15 октября 2026 в 12:27 в ответ на: Как устранить ошибку «Отсутствует Microsoft SQL Server Native Client» в 1С? #38849Ошибка означает, что на сервере 1С не установлен драйвер Microsoft SQL Server Native Client, необходимый для подключения к SQL Server.
Чаще всего ошибка появляется в схеме:
— сервер 1С находится на одном компьютере;
— Microsoft SQL Server находится на другом компьютере;
— новую информационную базу создают через консоль администрирования 1С.## Что сделать
### 1. Определите компьютер, куда устанавливать Native Client
Устанавливать компонент нужно на сервер 1С, а не только на сервер SQL Server.
Если используется кластер 1С из нескольких рабочих серверов, Native Client нужно установить на каждый сервер, который может обращаться к SQL-базе.
Проверить сервер 1С можно в свойствах информационной базы или в консоли администрирования:
1С (Код)12Сервер 1С: Предприятия: имя_сервера_1ССервер базы данных: имя_сервера_SQLУстановка только на компьютер пользователя, где запущена консоль, обычно проблему не решает.
—
### 2. Установите Microsoft SQL Server Native Client
Обычно нужен файл:
1С (Код)1sqlncli.msiОн может находиться:
— в установочном дистрибутиве Microsoft SQL Server;
— в каталоге установочного носителя SQL Server;
— в пакете дополнительных компонентов SQL Server;
— в ранее скачанном дистрибутиве SQL Server.Для старых версий платформы 1С чаще всего устанавливают:
1С (Код)1Microsoft SQL Server Native Client 11.0При установке желательно выбрать не только основные компоненты, но и пакет SDK, если он присутствует в установщике.
После установки в списке установленных программ должна появиться запись примерно такого вида:
1С (Код)1Microsoft SQL Server Native Client 11.0—
### 3. Учитывайте разрядность
Проверьте разрядность сервера 1С:
— для 64-разрядного сервера 1С установите 64-разрядный Native Client;
— для 32-разрядного сервера 1С установите 32-разрядный Native Client;
— в некоторых конфигурациях безопаснее установить оба варианта, если они доступны.Особенно это важно, если сервер 1С работает как 32-разрядное приложение на 64-разрядной Windows.
—
### 4. Перезапустите службы 1С
После установки драйвера перезапустите службу сервера 1С:
1. Откройте
services.msc.
2. Найдите службу вида:1С (Код)1Агент сервера 1С:Предприятия 8.x3. Перезапустите службу.
Если используется кластер серверов 1С, перезапустите службы на всех серверах кластера.
После этого снова выполните создание или подключение информационной базы.
—
## Что проверить, если ошибка осталась
### Доступность SQL Server
На сервере 1С проверьте:
— доступен ли SQL Server по имени;
— разрешено ли удаленное подключение;
— запущена ли служба SQL Server;
— открыт ли порт SQL Server, обычно TCP 1433;
— запущена ли служба SQL Server Browser, если используется именованный экземпляр;
— разрешен ли трафик в Windows Firewall.Например, если используется экземпляр:
1С (Код)1SQLSERVERSQLEXPRESSлибо:
1С (Код)1SERVERNAMEMSSQLSERVER2019нужно убедиться, что именно этот экземпляр доступен с сервера 1С.
—
### Учетная запись службы 1С
Служба сервера 1С должна иметь возможность подключаться к SQL Server.
Если используется Windows-аутентификация, учетной записи службы 1С необходимо выдать права на SQL Server и на нужную базу.
Если используется SQL-аутентификация, проверьте:
— имя пользователя;
— пароль;
— разрешен ли режим SQL Server и Windows-аутентификации;
— не заблокирован ли SQL-пользователь;
— существуют ли права на создание базы или подключение к ней.—
### Версию платформы 1С
В старых версиях 1С ошибка напрямую связана с отсутствием именно SQL Server Native Client.
В новых версиях SQL Server Native Client считается устаревшим компонентом. Если используется современная платформа 1С, рекомендуется:
— обновить платформу 1С до актуального релиза, совместимого с конфигурацией;
— использовать рекомендованный для этой версии 1С драйвер подключения;
— не устанавливать случайные версии Native Client без проверки совместимости.Но если конкретная версия 1С явно выдает сообщение про:
1С (Код)1Microsoft SQL Server Native Clientпервым практическим действием остается установка соответствующего Native Client на сервер 1С.
—
## Важный момент
Не путайте два разных случая:
### Ошибка при создании информационной базы
Тогда обычно достаточно:
1. установить
sqlncli.msiна сервер 1С;
2. перезапустить службы 1С;
3. повторить создание базы.### Ошибка при выполнении отчета или запроса
Если в тексте есть дополнительно:
1С (Код)1Добавление значения в столбец datetime привело к переполнениюили:
1С (Код)1Переполнение поля DATEDIFFто проблема уже может быть не в отсутствии драйвера, а в операциях над датами, например вычитании секунд из минимальной даты. В таком случае нужно отдельно проверять запрос, СКД и значения дат.
Рекомендую посмотреть здесь:
Ошибка отсутствие установленного MS SQL server Native Client
## Как создать первую управляемую форму в 1С
Ниже самый простой вариант: создадим справочник Товары и его управляемую форму элемента.
### 1. Включите управляемое приложение
В конфигураторе откройте:
Конфигурация → Открыть конфигурацию
Затем выберите корень конфигурации и проверьте свойство:
Основной режим запуска → Управляемое приложение
Если планируется запускать конфигурацию только в управляемом режиме, можно включить:
— Использовать управляемые формы
— при необходимости отключить использование обычных формТочный набор свойств зависит от версии платформы 1С.
—
## 2. Создайте справочник
В дереве конфигурации:
1. Нажмите правой кнопкой на ветке Справочники.
2. Выберите Добавить.
3. Назовите справочник:1С (Код)1Товары4. Откройте свойства справочника.
5. Перейдите на вкладку Данные.
6. Добавьте реквизиты:| Имя | Тип |
|—|—|
| Артикул | Строка, например 20 символов |
| Цена | Число, например 15.2 |
| Описание | Строка неограниченной длины |В справочнике автоматически есть стандартный реквизит Наименование.
—
## 3. Создайте управляемую форму элемента
В свойствах справочника Товары перейдите на вкладку Формы.
Нажмите кнопку добавления формы или кнопку с изображением лупы.
В конструкторе выберите:
1С (Код)1Основная форма элементаОбычно 1С предложит создать форму автоматически. Согласитесь с настройками и нажмите Готово.
В редакторе формы будут созданы:
— реквизит формы
Объект;
— элементы формы;
— поля дляНаименование,Артикул,Цена,Описание;
— стандартные команды записи и закрытия.Нажмите Записать и закрыть.
Управляемая форма элемента справочника создана.
—
## 4. Создайте форму списка
Теперь создадим форму, в которой будут отображаться все товары.
В свойствах справочника Товары снова откройте вкладку Формы.
Создайте:
1С (Код)1Основная форма спискаВ большинстве случаев конструктор автоматически создаст:
— реквизит
Списоктипа Динамический список;
— табличное полеСписок;
— стандартные команды добавления, изменения и удаления элементов.После создания откройте форму списка в редакторе.
Слева находится дерево элементов формы, справа доступны:
— реквизиты формы;
— команды;
— параметры;
— свойства выбранного элемента.Выделите табличное поле
Списоки проверьте свойство:1С (Код)1ПутьКДаннымОно должно ссылаться на реквизит формы:
1С (Код)1СписокЕсли список создан конструктором, это уже будет настроено автоматически.
—
## 5. Добавьте справочник в подсистему
Чтобы форма появилась в пользовательском интерфейсе:
1. Создайте подсистему, например:
1С (Код)1Продажи2. Откройте состав подсистемы.
3. Добавьте в нее справочник Товары.
4. В свойствах подсистемы включите:1С (Код)1Включать в командный интерфейс5. Откройте командный интерфейс подсистемы.
6. Найдите команду открытия справочника Товары.
7. Убедитесь, что для нее включена видимость в панели навигации.После этого справочник будет доступен пользователю через раздел Продажи.
—
## 6. Обновите конфигурацию базы данных
В конфигураторе нажмите:
1С (Код)1Конфигурация → Обновить конфигурацию базы данныхМожно использовать клавишу F7.
Затем запустите 1С в режиме предприятия:
1С (Код)1Отладка → Начать отладкуили клавишу F5.
Откройте раздел Продажи, затем справочник Товары.
Нажмите Создать. Откроется созданная управляемая форма элемента.
—
# Как устроена управляемая форма
Управляемая форма состоит из нескольких частей.
## Реквизиты формы
Реквизит формы хранит данные, с которыми работает форма.
Например:
1С (Код)1ОбъектДля формы элемента это обычно объект справочника:
1С (Код)1СправочникОбъект.ТоварыДля формы списка это обычно:
1С (Код)1ДинамическийСписок## Элементы формы
Элементы отображаются пользователю:
— поле ввода;
— поле даты;
— флажок;
— таблица;
— кнопка;
— группа;
— декорация;
— поле картинки.Например, реквизит
Ценасам по себе на форме не отображается. Для него должен быть создан элемент формы, связанный с этим реквизитом.У элемента формы свойство ПутьКДанным должно иметь значение:
1С (Код)1Объект.ЦенаДля наименования:
1С (Код)1Объект.НаименованиеДля артикула:
1С (Код)1Объект.Артикул—
# Как добавить поле вручную
Допустим, поле
Ценане появилось на форме.1. Откройте форму элемента справочника.
2. В дереве элементов выберите группу, куда нужно добавить поле.
3. Нажмите Добавить.
4. Выберите тип элемента:1С (Код)1Поле формы5. В свойстве ПутьКДанным укажите:
1С (Код)1Объект.Цена6. В свойстве Вид можно выбрать:
1С (Код)1Поле ввода7. В свойстве Заголовок укажите:
1С (Код)1ЦенаАналогично можно добавить поле для артикула:
1С (Код)1Объект.Артикул—
# Как добавить кнопку
Например, добавим кнопку, которая будет выводить сообщение.
## 1. Создайте команду
Откройте форму элемента справочника.
В правой части редактора перейдите на вкладку Команды.
Добавьте команду:
1С (Код)1ПоказатьСообщениеУкажите заголовок:
1С (Код)1Показать сообщениеПосле создания команды перетащите ее в дерево элементов формы, например в командную панель.
## 2. Создайте обработчик команды
У команды вызовите создание обработчика события Действие или Обработка команды.
Платформа создаст процедуру примерно такого вида:
1С (Код)123456&НаКлиентеПроцедура ПоказатьСообщение(Команда)Сообщить("Открыта форма товара");КонецПроцедурыВ управляемом приложении код формы обычно выполняется на клиенте или сервере. Для простой команды сообщение можно вывести на клиенте.
—
# Пример проверки цены
Можно добавить проверку, чтобы цена не была отрицательной.
У поля
Ценасоздайте обработчик события ОкончаниеВводаТекста или проверку перед записью объекта.Для проверки перед записью формы можно использовать обработчик
ПередЗаписьюНаСервере:1С (Код)123456789&НаСервереПроцедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)Если ТекущийОбъект.Цена < 0 ТогдаСообщить("Цена не может быть отрицательной");Отказ = Истина;КонецЕсли;КонецПроцедурыВ некоторых версиях платформы и типах форм имя параметров обработчика может отличаться. Лучше создавать обработчик через палитру свойств формы, тогда 1С сама подставит правильную сигнатуру.
Более простой вариант для проверки непосредственно в обработчике изменения поля:
1С (Код)123456789&НаКлиентеПроцедура ЦенаИзменение(Элемент)Если Объект.Цена < 0 ТогдаОбъект.Цена = 0;Сообщить("Цена не может быть отрицательной");КонецЕсли;КонецПроцедурыОбработчик создается так:
1. Выберите поле
Ценав дереве формы.
2. Откройте палитру свойств.
3. Найдите событие Изменение.
4. Нажмите кнопку создания обработчика.—
# Как сделать форму документа с табличной частью
Для первого знакомства со справочником достаточно формы элемента. Но форма документа создается похожим образом.
Например, создайте документ ЗаказПокупателя.
У документа добавьте табличную часть:
1С (Код)1ТоварыВ табличной части создайте реквизиты:
| Имя | Тип |
|—|—|
| Номенклатура | СправочникСсылка.Товары |
| Количество | Число 10.3 |
| Цена | Число 15.2 |
| Сумма | Число 15.2 |Затем:
1. Откройте вкладку Формы документа.
2. Создайте Основную форму документа.
3. Конструктор добавит:
— поля реквизитов документа;
— таблицу табличной части;
— команды записи и проведения.
4. В форме появится табличное поле, связанное примерно с путем:1С (Код)1Объект.ТоварыЕсли табличная часть не добавилась автоматически:
1. Добавьте в форму элемент Таблица формы.
2. Укажите путь к данным:1С (Код)1Объект.Товары3. Согласитесь на автоматическое добавление полей табличной части.
—
# Главное отличие управляемой формы от обычной
В обычной форме разработчик работает непосредственно с элементами диалога.
В управляемой форме есть разделение:
— реквизиты формы хранят данные;
— элементы формы отображают данные;
— команды формы выполняют действия;
— код выполняется на клиенте или сервере;
— доступность, видимость и заголовки элементов можно изменять программно.Например, сделать поле цены недоступным:
1С (Код)123456&НаКлиентеПроцедура ПриОткрытии(Отказ)Элементы.Цена.Доступность = Ложь;КонецПроцедурыСкрыть поле:
1С (Код)123456&НаКлиентеПроцедура ПриОткрытии(Отказ)Элементы.Цена.Видимость = Ложь;КонецПроцедурыИзменить заголовок:
1С (Код)123456&НаКлиентеПроцедура ПриОткрытии(Отказ)Элементы.Цена.Заголовок = "Розничная цена";КонецПроцедурыВ новых версиях платформы событие открытия формы чаще создается с параметром
Отказ:1С (Код)1234&НаКлиентеПроцедура ПриОткрытии(Отказ)КонецПроцедуры—
# Минимальный порядок действий
Для первой формы достаточно выполнить следующие действия:
1. Создать справочник.
2. Добавить его реквизиты.
3. Создать основную форму элемента.
4. Создать основную форму списка.
5. Добавить справочник в подсистему.
6. Обновить конфигурацию базы данных.
7. Запустить 1С в режиме предприятия.
8. Открыть форму и создать первый элемент.Самый важный момент: для отображения реквизита на управляемой форме должен существовать элемент формы с правильно установленным свойством ПутьКДанным, например:
1С (Код)1Объект.Наименованиеили:
1С (Код)1Объект.Цена14 октября 2026 в 14:57 в ответ на: Как улучшить производительность при проверке наличия изображений в 1С? #38845Да, скорость можно увеличить в разы. Сейчас основная проблема в том, что для каждой из примерно 9000 номенклатур вы вызываете:
1С (Код)1УправлениеВложениямиКлиент.ПолучитьОсновноеИзображение(Номенклатура)А эта функция не просто проверяет наличие картинки. Она:
1. Получает значение константы.
2. Обращается к реквизитуОсновноеИзображение.
3. Вызывает.Получить(), то есть загружает двоичные данные картинки.
4. Проверяет размер двоичных данных.
5. При хранении во внешнем каталоге проверяет файл.
6. При наличии файла загружает его черезНовый ДвоичныеДанные(...).Для фильтрации вам сама картинка не нужна. Нужен только признак:
1С (Код)1Истина / Ложь## 1. Исправьте общий модуль
Создайте отдельную функцию, которая проверяет только наличие изображения и не загружает его содержимое.
Например, в общем модуле
УправлениеВложениямиСерверс флажком «Вызов сервера»:1С (Код)1234567891011121314151617181920212223242526272829Функция ЕстьОсновноеИзображение(СсылкаНаОбъект) ЭкспортЕсли Не ЗначениеЗаполнено(СсылкаНаОбъект) ТогдаВозврат Ложь;КонецЕсли;КаталогВложений = Константы.КаталогВложений.Получить();Если ПустаяСтрока(КаталогВложений) Тогда// Вложения хранятся в информационной базе.// Важно: не вызываем Получить().ХранилищеИзображения = СсылкаНаОбъект.ОсновноеИзображение;Возврат ЗначениеЗаполнено(ХранилищеИзображения);Иначе// Вложения хранятся во внешнем каталоге.ПолноеИмяФайла = КаталогВложений+ ""+ СсылкаНаОбъект.УникальныйИдентификатор()+ "main_image";Возврат Новый Файл(ПолноеИмяФайла).Существует();КонецЕсли;КонецФункцииКлючевые отличия:
1С (Код)1СсылкаНаОбъект.ОсновноеИзображениевместо:
1С (Код)1СсылкаНаОбъект.ОсновноеИзображение.Получить()И для внешнего хранения не выполняется:
1С (Код)1Новый ДвоичныеДанные(ПолноеИмяФайла)Это уже существенно ускорит проверку.
Но если вызвать эту функцию из клиентского кода 9000 раз, всё равно получится до 9000 серверных вызовов. Поэтому лучше выполнять проверку пакетно.
—
# 2. Пакетная проверка картинок
В том же серверном общем модуле создайте функцию, которая принимает массив номенклатуры и возвращает таблицу с признаками наличия.
1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940414243Функция ПроверитьНаличиеИзображений(МассивНоменклатуры) ЭкспортРезультат = Новый ТаблицаЗначений;Результат.Колонки.Добавить("Номенклатура");Результат.Колонки.Добавить("ЕстьИзображение");КаталогВложений = Константы.КаталогВложений.Получить();Для Каждого Номенклатура Из МассивНоменклатуры ЦиклЕсли Не ЗначениеЗаполнено(Номенклатура) ТогдаПродолжить;КонецЕсли;ЕстьИзображение = Ложь;Если ПустаяСтрока(КаталогВложений) Тогда// Не загружаем двоичные данные.ЕстьИзображение = ЗначениеЗаполнено(Номенклатура.ОсновноеИзображение);ИначеПолноеИмяФайла = КаталогВложений+ ""+ Номенклатура.УникальныйИдентификатор()+ "main_image";ЕстьИзображение = Новый Файл(ПолноеИмяФайла).Существует();КонецЕсли;СтрокаРезультата = Результат.Добавить();СтрокаРезультата.Номенклатура = Номенклатура;СтрокаРезультата.ЕстьИзображение = ЕстьИзображение;КонецЦикла;Возврат Результат;КонецФункцииТеперь вместо 9000 обращений к серверу будет один вызов.
—
# 3. Как вызвать пакетную проверку в вашем коде
После заполнения
ТабЗначенийсформируйте массив ссылок:1С (Код)12345678910МассивНоменклатуры = Новый Массив;Для Каждого СтрокаТаблицы Из ТабЗначений ЦиклМассивНоменклатуры.Добавить(СтрокаТаблицы.Номенклатура);КонецЦикла;ТаблицаНаличияИзображений =УправлениеВложениямиСервер.ПроверитьНаличиеИзображений(МассивНоменклатуры);Затем создайте соответствие для быстрого поиска признака:
1С (Код)12345678СоответствиеКартинок = Новый Соответствие;Для Каждого СтрокаНаличия Из ТаблицаНаличияИзображений ЦиклСоответствиеКартинок.Вставить(СтрокаНаличия.Номенклатура,СтрокаНаличия.ЕстьИзображение);КонецЦикла;После этого фильтруйте таблицу без обращения к картинке:
1С (Код)123456789101112131415161718192021222324252627282930313233343536ТЗнач = Новый ТаблицаЗначений;ТЗнач.Колонки.Добавить("Номенклатура");ТЗнач.Колонки.Добавить("Артикул");ТЗнач.Колонки.Добавить("МинимальныйОстаток");ТЗнач.Колонки.Добавить("Потребность");ТЗнач.Колонки.Добавить("Резерв");ТЗнач.Колонки.Добавить("Приобрели");ТЗнач.Колонки.Добавить("Продали");ТЗнач.Колонки.Добавить("НачальныйОтстаток");ТЗнач.Колонки.Добавить("КонечныйОстаток");Для Каждого СтрокаТаблицы Из ТабЗначений ЦиклЕстьИзображение = Ложь;СоответствиеКартинок.Свойство(СтрокаТаблицы.Номенклатура,ЕстьИзображение);// ПолеВыбораФото = 2 - только с картинкамиЕсли ПолеВыбораФото = 2 И Не ЕстьИзображение ТогдаПродолжить;КонецЕсли;// ПолеВыбораФото = 3 - только без картинокЕсли ПолеВыбораФото = 3 И ЕстьИзображение ТогдаПродолжить;КонецЕсли;НоваяСтрока = ТЗнач.Добавить();ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицы);КонецЦикла;ТабЗначений = ТЗнач;Здесь я предполагаю:
1С (Код)1ПолеВыбораФото = 1означает «все товары»,
1С (Код)1ПолеВыбораФото = 2означает «только с картинками»,
1С (Код)1ПолеВыбораФото = 3означает «только без картинок».
У вас сейчас для значения
1стоит пустая ветка:1С (Код)123Если ПолеВыбораФото = 1 ТогдаИначеИз-за этого лучше явно разделить режимы.
—
# 4. Еще лучше, если картинки хранятся в информационной базе
Если в вашей базе
КаталогВложенийпустой, картинки хранятся в реквизитеОсновноеИзображениев базе. Тогда можно попробовать определить наличие прямо в запросе, не перебирая 9000 строк после выполнения запроса.В запрос добавляется поле:
1С (Код)12345| ВЫБОР| КОГДА ВТ_ОбъединениеТрехТабл.Номенклатура.ОсновноеИзображение ЕСТЬ НЕ NULL| ТОГДА ИСТИНА| ИНАЧЕ ЛОЖЬ| КОНЕЦ КАК ЕстьИзображение,Например, начало запроса:
1С (Код)123456789101112131415161718192021222324|ВЫБРАТЬ| ВТ_ОбъединениеТрехТабл.Номенклатура КАК Номенклатура,| ВТ_ОбъединениеТрехТабл.Артикул КАК Артикул,| ВТ_ОбъединениеТрехТабл.НачальныйОтстаток КАК НачальныйОтстаток,| ВТ_ОбъединениеТрехТабл.КонечныйОстаток КАК КонечныйОстаток,| ВТ_ОбъединениеТрехТабл.Потребность КАК Потребность,| ВТ_ОбъединениеТрехТабл.Резерв КАК Резерв,| ВТ_ОбъединениеТрехТабл.МинимальныйОстаток КАК МинимальныйОстаток,| ПартииТоваровНаСкладахОбороты.КоличествоПриход КАК Приобрели,| ПартииТоваровНаСкладахОбороты.КоличествоРасход КАК Продали,| ВЫБОР| КОГДА ВТ_ОбъединениеТрехТабл.Номенклатура.ОсновноеИзображение ЕСТЬ НЕ NULL| ТОГДА ИСТИНА| ИНАЧЕ ЛОЖЬ| КОНЕЦ КАК ЕстьИзображение|ИЗ| ВТ_ОбъединениеТрехТабл КАК ВТ_ОбъединениеТрехТабл| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах.Обороты(| &ДатаНачало,| &ДатаКонец,| ,| ) КАК ПартииТоваровНаСкладахОбороты| ПО ВТ_ОбъединениеТрехТабл.Номенклатура.Ссылка =| ПартииТоваровНаСкладахОбороты.Номенклатура.СсылкаДальше при заполнении таблицы добавьте колонку:
1С (Код)1ТабЗначений.Колонки.Добавить("ЕстьИзображение");И заполнение:
1С (Код)12Стр.ЕстьИзображение =ВыборкаДетальныеЗаписи.ЕстьИзображение;После этого фильтр будет очень простой:
1С (Код)1234567Если ПолеВыбораФото = 2 И Не СтЧасти.ЕстьИзображение ТогдаПродолжить;КонецЕсли;Если ПолеВыбораФото = 3 И СтЧасти.ЕстьИзображение ТогдаПродолжить;КонецЕсли;Однако этот вариант подходит только для хранения картинок в базе. Если
КаталогВложенийзаполнен, SQL-запрос не знает, существует ли файл на диске. В таком случае используйте пакетную серверную проверку файлов.—
# 5. Не вызывайте
ПолучитьОсновноеИзображениедля фильтрацииВаш текущий код:
1С (Код)123Картинка = УправлениеВложениямиКлиент.ПолучитьОсновноеИзображение(Номенклатура);Если ЗначениеЗаполнено(Картинка) Тогданужно заменить на:
1С (Код)12345ЕстьКартинка = УправлениеВложениямиСервер.ЕстьОсновноеИзображение(Номенклатура);Если ЕстьКартинка ТогдаНо одиночный вызов всё равно будет медленнее пакетного. Оптимальный вариант для 9000 строк:
1. Получить результат запроса.
2. Одним вызовом проверить наличие изображений.
3. Получить соответствиеНоменклатура -> ЕстьИзображение.
4. Отфильтровать таблицу.
5. Только после этого выводить макет.—
# 6. Уберите лишнее заполнение таблицы
Сейчас вы вручную создаете
ТабЗначенийи переносите каждое поле:1С (Код)123Стр.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;Стр.Артикул = ВыборкаДетальныеЗаписи.Артикул;...Если структура результата запроса вас устраивает, можно сразу выгрузить результат:
1С (Код)1ТабЗначений = Запрос.Выполнить().Выгрузить();То есть вместо:
1С (Код)123456РезультатЗапроса = Запрос.Выполнить();ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();Пока ВыборкаДетальныеЗаписи.Следующий() Цикл...КонецЦикла;использовать:
1С (Код)1ТабЗначений = Запрос.Выполнить().Выгрузить();При этом в запросе должны быть только необходимые поля.
Если используете вариант с признаком картинки в запросе, достаточно:
1С (Код)1ТабЗначений = Запрос.Выполнить().Выгрузить();А затем:
1С (Код)123456789101112131415161718192021222324Если ПолеВыбораФото <> 1 ТогдаТЗнач = ТабЗначений.СкопироватьКолонки();Для Каждого СтрокаТаблицы Из ТабЗначений ЦиклЕсли ПолеВыбораФото = 2И Не СтрокаТаблицы.ЕстьИзображение ТогдаПродолжить;КонецЕсли;Если ПолеВыбораФото = 3И СтрокаТаблицы.ЕстьИзображение ТогдаПродолжить;КонецЕсли;НоваяСтрока = ТЗнач.Добавить();ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТаблицы);КонецЦикла;ТабЗначений = ТЗнач;КонецЕсли;## Важное замечание по общему модулю
Модуль с функцией проверки должен вызываться на сервере, особенно если указан внешний каталог вложений. Сервер 1С должен иметь доступ к каталогу:
1С (Код)1КаталогВложенийЕсли каталог находится на другом компьютере, сервер 1С должен видеть его по сетевому пути, например:
1С (Код)1\СерверФайловВложенияА не по локальному пути пользователя:
1С (Код)1C:ВложенияИначе
Файл.Существует()будет проверять диск сервера 1С, а не диск клиента.Самый быстрый вариант для вашей задачи:
1С (Код)1ТабЗначений = Запрос.Выполнить().Выгрузить();плюс определение признака
ЕстьИзображениенепосредственно в запросе, если изображения хранятся в базе. Если изображения лежат в каталоге, используйте одну пакетную серверную проверку, но не загружайте сами двоичные данные.12 октября 2026 в 14:55 в ответ на: Как в 1С БГУ собрать ОСВ по контрагентам с официальным наименованием? #38842В 1С:БГУ оборотно-сальдовую ведомость по контрагентам можно сформировать через отчет «Оборотно-сальдовая ведомость по счету».
### 1. Формирование отчета
Откройте:
Отчеты → Стандартные отчеты → Оборотно-сальдовая ведомость по счету
Укажите:
1. Период отчета.
2. Рабочий счет, например 302.XX, 205.XX, 206.XX или другой счет, по которому ведется учет расчетов с контрагентами.
3. Организацию, если в базе их несколько.
4. Нажмите «Настройки» или «Показать настройки».### 2. Настройка детализации по контрагентам
В настройках отчета перейдите на вкладку «Группировка» или «Структура отчета».
Добавьте группировку:
Контрагенты
Если требуется дополнительная детализация, можно добавить:
— договоры;
— документы расчетов;
— организации;
— счета учета;
— КЭК;
— подразделения.Для обычной ведомости по контрагентам достаточно оставить группировку «Контрагенты».
После этого нажмите «Сформировать».
### 3. Вывод официального наименования контрагента
В стандартном отчете 1С:БГУ обычно выводится представление элемента справочника «Контрагенты», а не отдельный реквизит «Официальное наименование». Поэтому сначала проверьте, как заполнена карточка контрагента:
Справочники → Контрагенты → открыть контрагента
В карточке должно быть заполнено поле:
Официальное наименование
В некоторых версиях БГУ оно называется:
— Полное наименование;
— Официальное наименование;
— Наименование для печати.Если в вашей версии программы представление контрагента настроено на официальное наименование, оно будет отображаться непосредственно в отчете.
### 4. Если отчет показывает краткое наименование
Если в ОСВ отображается только краткое название, например:
> ООО «Ромашка»
а необходимо вывести:
> Общество с ограниченной ответственностью «Ромашка»
то в настройках стандартного отчета может не быть возможности заменить представление на конкретный реквизит справочника.
В этом случае попробуйте следующий вариант:
1. Сформируйте ОСВ по счету.
2. Откройте меню Еще → Изменить вариант отчета.
3. Перейдите на вкладку «Поля и сортировки» или «Выбранные поля».
4. Найдите поле, относящееся к контрагенту.
5. Проверьте, доступны ли варианты:
— Контрагент.Наименование;
— Контрагент.Официальное наименование;
— Контрагент.Полное наименование.Если поле «Официальное наименование» доступно, добавьте его в выбранные поля и установите его первым в списке. После этого сохраните вариант отчета и сформируйте отчет повторно.
### 5. Если поля «Официальное наименование» нет
Это нормальная ситуация. В стандартной ОСВ контрагент является видом субконто, а официальный текст является реквизитом элемента справочника. Стандартный отчет умеет группировать данные по самому контрагенту, но не всегда позволяет вывести отдельные реквизиты этого справочника.
Тогда есть два рабочих варианта.
#### Вариант 1. Использовать отчет «Анализ субконто»
Откройте:
Отчеты → Стандартные отчеты → Анализ субконто
Настройте:
— период;
— вид субконто: Контрагенты;
— нужный счет или группу счетов;
— организацию;
— группировку по контрагентам.В некоторых версиях БГУ в варианте этого отчета доступен вывод дополнительных реквизитов контрагента, в том числе официального наименования.
#### Вариант 2. Выгрузить отчет в таблицу и добавить официальные наименования
Если стандартный отчет не выводит нужный реквизит:
1. Сформируйте ОСВ с группировкой по контрагентам.
2. Выгрузите отчет в Excel.
3. Из справочника «Контрагенты» выгрузите соответствие:
— краткое наименование;
— официальное наименование;
— ИНН;
— КПП.
4. Соедините данные в Excel по контрагенту, ИНН или уникальному идентификатору.Для постоянного использования лучше создать отдельный вариант отчета или внешнюю обработку, которая будет получать обороты по счету и присоединять к ним реквизит «Официальное наименование».
Важно: если нужно именно сальдо и обороты по каждому контрагенту, группировку следует делать по виду субконто «Контрагенты». Группировать непосредственно по полю «Официальное наименование» стандартная ОСВ обычно не позволяет, поскольку это реквизит справочника, а не отдельное субконто бухгалтерского учета.
12 октября 2026 в 10:29 в ответ на: Почему в УТ 11.6 запись и проведение заказа требуют отдельного сохранения? #38840В УТ 11.6 это обычно связано с тем, что статусы оплаты и отгрузки рассчитываются не по данным, которые сейчас находятся в форме, а по данным регистров. Эти данные появляются или обновляются только после записи и проведения документа.
### Почему так происходит
В заказе клиента есть несколько разных понятий:
— Статус документа: «На согласовании», «К выполнению», «К отгрузке», «Закрыт» и т. п.
— Состояние оплаты: оплачено, частично оплачено, не оплачено.
— Состояние отгрузки: не отгружено, частично отгружено, отгружено.
— Состояние обеспечения: резервируется, обеспечивается, обеспечено и т. д.Состояние оплаты и отгрузки определяется по движениям в регистрах и связанным документам:
— заказ клиента;
— реализация товаров и услуг;
— расходный ордер;
— эквайринговая операция;
— приходный кассовый ордер;
— платежное поручение;
— взаимозачет или другой документ оплаты.Пока заказ находится только в форме и не записан, у него могут отсутствовать или быть неактуальными:
— ссылка на документ;
— движения регистра заказов;
— актуальные связи с документами оплаты и отгрузки;
— рассчитанные данные по взаиморасчетам.Поэтому после простого сохранения 1С получает постоянную ссылку и обновляет данные заказа, а после проведения формирует движения. Только после этого расчет статусов дает правильный результат.
### Важный момент
Если нажимается именно кнопка «Провести», то в типовой конфигурации отдельное предварительное сохранение обычно не требуется. Проведение должно само выполнить запись и сформировать движения.
То есть нормальная последовательность для нового документа такая:
1. Заполнить заказ.
2. Нажать «Провести».
3. Документ должен записаться и провести движения за один раз.
4. После обновления формы должны появиться актуальные состояния оплаты, отгрузки и обеспечения.Если же сначала обязательно нажимать «Записать», закрывать или обновлять форму, а затем отдельно «Провести», это уже может быть связано с настройкой формы, расширением или особенностями конкретного релиза.
### Что проверить в первую очередь
#### 1. Какая команда используется
Убедитесь, что пользователь нажимает:
— «Провести», а не «Записать»;
— либо «Провести и закрыть».Команда «Записать» только сохраняет документ. Она не формирует движения документа. Поэтому статусы, зависящие от регистров, могут остаться прежними.
#### 2. Не установлен ли статус «На согласовании»
В УТ 11.6 заказ со статусом «На согласовании» не должен полноценно участвовать в обеспечении и отгрузке. Для рабочего заказа обычно используется статус:
— «К выполнению»;
— «К отгрузке»;
— либо другой статус, предусмотренный выбранным вариантом использования заказов.Проверьте в заказе поле «Статус» и вариант использования заказов:
НСИ и администрирование → Продажи → Оптовые продажи → Заказы клиентов
Возможные варианты:
— «Заказ как счет»;
— «Заказ только со склада»;
— «Заказ со склада и под заказ».Если используется вариант «Заказ как счет», контроль выполнения, резервирования и отгрузки может быть ограничен.
#### 3. Проверить порядок расчетов
Состояние оплаты может не рассчитываться так, как ожидается, если в заказе установлен порядок расчетов:
— «По накладным»;
— «По заказам»;
— «По договору».При расчетах по накладным оплата может закрывать не сам заказ, а конкретные документы реализации. В результате в заказе статус оплаты не изменится так, как при расчетах по заказу.
Проверить это можно в соглашении с клиентом и в самом заказе:
— соглашение с клиентом;
— условия оплаты;
— порядок расчетов;
— график оплаты;
— этапы оплаты.#### 4. Проверить проведение связанных документов
Статус отгрузки не изменится, если реализация или складские документы:
— не проведены;
— проведены другим складом;
— оформлены не на тот заказ клиента;
— оформлены частично;
— имеют другое соглашение или организацию;
— созданы без заполненного основания «Заказ клиента».Например, если реализация оформлена просто от клиента, но поле «Заказ клиента» не заполнено, она может не уменьшить задолженность по конкретному заказу.
#### 5. Обновить форму заказа
Иногда движения уже сформированы, но форма показывает старое состояние. Проверьте:
1. Проведите заказ.
2. Закройте форму.
3. Откройте заказ заново.
4. Нажмите «Еще → Обновить», если такая команда доступна.
5. Проверьте состояние заказа через команду анализа или расшифровки состояния.В управляемом приложении отображаемые состояния могут обновляться не сразу после проведения, особенно если заказ был открыт долгое время.
### Если раньше проводилось одним нажатием, а теперь нет
Наиболее вероятные причины:
1. Изменилось расширение конфигурации.
Расширение могло перехватить команду записи или проведения.2. После обновления конфигурации изменилась форма заказа.
В команде формы могли разделиться действия «Записать» и «Провести».3. Используется нетиповая форма документа.
Это можно проверить через технические сведения формы или сравнение с типовой конфигурацией.4. Изменился статус заказа.
Документ записывается, но при статусе «На согласовании» не выполняет ожидаемое обеспечение.5. Изменилась настройка соглашения.
После изменения порядка расчетов статусы могут начать определяться по другим документам.6. Не выполняется автоматический расчет состояния.
В некоторых случаях состояние пересчитывается только после проведения заказа или связанных документов.7. Есть фоновые задания обмена или интеграции.
Если оплаты и реализации загружаются из внешней системы, данные в регистрах могут появляться с задержкой.### Как быстро определить причину
Откройте проблемный заказ и выполните:
1. Запишите его.
2. Проведите.
3. Откройте команду анализа состояния заказа, например «Состояние заказа», «Состояние обеспечения» или аналогичную команду в форме.
4. Посмотрите расшифровку:
— сколько заказано;
— сколько отгружено;
— сколько оплачено;
— сколько зарезервировано;
— какие документы учтены.Если после проведения движения и статусы стали правильными, то это нормальная логика работы УТ 11.6. Если же проведение не помогает, а помогает только последовательность записать → закрыть → открыть → провести, то нужно проверять форму документа и расширения.
Для разработчика в таком случае стоит проверить:
— обработчики
ПередЗаписью,ПриЗаписи,ПослеЗаписи;
— команду проведения формы;
— наличие расширений на документ «Заказ клиента»;
— не вызывается ли вместо проведения обычная запись;
— не выполняется ли изменение состояния только вПослеЗаписи;
— нет ли программного вызова записи с режимомРежимЗаписиДокумента.Записьвместо проведения.В типовом варианте проведение должно выполняться примерно так:
1С (Код)123Объект.Записать(РежимЗаписиДокумента.Проведение,РежимПроведенияДокумента.Оперативный);Если программно вызывается только:
1С (Код)12Объект.Записать(РежимЗаписиДокумента.Запись);то документ будет сохранен, но движения и связанные состояния могут не обновиться.
Практически: если кнопка «Провести» сама не выполняет запись нового заказа, а требует предварительного сохранения, это не обычная необходимость УТ 11.6, а повод проверить расширения, измененную форму документа и обработчики записи.
Если речь именно о конфигурировании и доработке «1С:Бухгалтерии 8», редакция 3.0, а не о работе бухгалтера в программе, лучше изучать одновременно:
1. платформу «1С:Предприятие 8.3»;
2. устройство типовой конфигурации БП 3.0;
3. встроенный язык 1С и язык запросов;
4. расширения конфигурации;
5. обмены, регистры, проведение документов и бухгалтерский учет.Отдельного полноценного курса только по внутреннему устройству БП 3.0 мало. Конфигурация большая, а в разных релизах меняются формы, общие модули и механизмы учета.
## Видеоуроки
### 1. Официальные материалы 1С
Начните с материалов фирмы «1С» по платформе:
Рекомендую посмотреть здесь:
— https://v8.1c.ru/obuchenie/
— https://its.1c.ru/
— https://edu.1cfresh.com/Ищите темы:
— управляемое приложение;
— разработка прикладных решений;
— язык запросов;
— регистры сведений;
— регистры накопления;
— бухгалтерские регистры;
— планы счетов;
— документы и движения;
— расширения конфигурации;
— система компоновки данных;
— клиент-серверное взаимодействие.На официальном сайте не всегда удобно искать именно обучающие ролики, поэтому полезно использовать поиск по YouTube с готовыми запросами:
— https://www.youtube.com/results?search_query=1С+Бухгалтерия+3.0+конфигурирование
— https://www.youtube.com/results?search_query=1С+расширение+конфигурации+Бухгалтерия+3.0
— https://www.youtube.com/results?search_query=1С+разработка+расширений+конфигурации
— https://www.youtube.com/results?search_query=1С+регистры+бухгалтерии+проведение+документов
— https://www.youtube.com/results?search_query=1С+БСП+разработка+конфигурации
— https://www.youtube.com/results?search_query=1С+язык+запросов+обучение### 2. Infostart
На Infostart много практических материалов именно по реальной разработке, отладке и доработке типовых конфигураций.
Рекомендую посмотреть здесь:
— https://infostart.ru/1c/
— https://infostart.ru/1c/articles/
— https://infostart.ru/1c/videos/Для поиска используйте запросы:
— «БП 3.0 расширение конфигурации»;
— «Бухгалтерия предприятия 3.0 разработка»;
— «БП 3.0 регистр бухгалтерии»;
— «БП 3.0 проведение документа»;
— «БП 3.0 подписка на событие»;
— «БП 3.0 дополнительный реквизит»;
— «БП 3.0 внешняя печатная форма»;
— «БП 3.0 внешняя обработка»;
— «БП 3.0 СКД»;
— «БП 3.0 универсальный отчет».Полезно учитывать, что часть старых публикаций написана под обычные доработки конфигурации. Сейчас для типовой БП 3.0 в большинстве случаев предпочтительнее использовать расширение, а не снимать конфигурацию с поддержки.
### 3. Каналы и видеопоиск
В YouTube лучше искать не только по фразе «БП 3.0», но и по общим темам 1С. Например, конкретную задачу в БП 3.0 часто объясняют в ролике по платформе:
— «Как сделать расширение конфигурации 1С»;
— «Как добавить реквизит в документ через расширение»;
— «Как изменить форму документа в расширении»;
— «Как подписаться на событие проведения документа»;
— «Как получить движения документа»;
— «Как написать запрос к регистру бухгалтерии»;
— «Как сделать внешнюю печатную форму»;
— «Как добавить команду в форму документа»;
— «Как использовать БСП в расширении».Это эффективнее, чем искать только ролики с названием «обучение БП 3.0».
## Книги по платформе 1С
### 1. «1С:Предприятие 8.3. Практическое пособие разработчика»
Авторы: А. В. Радченко, М. В. Хрущ.
Это одна из основных книг для изучения конфигурирования. В ней хорошо разобраны:
— объекты конфигурации;
— справочники;
— документы;
— регистры сведений;
— регистры накопления;
— регистры бухгалтерии;
— планы счетов;
— отчеты;
— обработки;
— формы;
— роли;
— подсистемы;
— проведение документов;
— запросы;
— управляемое приложение.Книга написана на учебной конфигурации, а не на БП 3.0, но принципы полностью применимы к бухгалтерии.
В базе знаний есть фрагмент этой книги. Рекомендую посмотреть здесь:
— https://its.1c.ru/db/metod8dev
— https://v8.1c.ru/metod/books/Также можно искать издание по названию:
— https://www.ozon.ru/search/?text=1С%20Предприятие%208.3%20Практическое%20пособие%20разработчика
— https://www.labirint.ru/search/1%D0%A1%20%D0%9F%D1%80%D0%B5%D0%B4%D0%BF%D1%80%D0%B8%D1%8F%D1%82%D0%B8%D0%B5%208.3%20%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5%20%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%B8%D0%B5%20%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%87%D0%B8%D0%BA%D0%B0При покупке смотрите, чтобы книга была по версии 8.3 и управляемому приложению. Старые книги по 8.1 и 8.2 могут быть полезны, но интерфейс и некоторые возможности платформы уже отличаются.
### 2. «Разработка прикладных решений на платформе 1С:Предприятие 8.3»
Также авторы: А. В. Радченко, М. В. Хрущ.
Книга более ориентирована на разработчика прикладных решений. Полезна для понимания:
— архитектуры конфигурации;
— клиент-серверной работы;
— управляемых форм;
— разделения клиентского и серверного кода;
— механизмов проведения;
— работы с данными;
— ролей и прав;
— производительности;
— обменов.Рекомендую искать здесь:
— https://www.ozon.ru/search/?text=Разработка%20прикладных%20решений%20на%20платформе%201С%20Предприятие%208.3
— https://v8.1c.ru/metod/books/### 3. «1С:Предприятие 8.3. Руководство разработчика»
Это не столько учебник, сколько справочная документация. Ее удобно использовать после изучения основ.
Рекомендую посмотреть здесь:
— https://its.1c.ru/db/v8doc
— https://v8.1c.ru/doc8/По этой документации удобно проверять:
— свойства объектов конфигурации;
— методы встроенного языка;
— параметры процедур;
— особенности серверного и клиентского вызова;
— работу с формами;
— запросы;
— расширения.## Что читать именно по БП 3.0
### 1. Описание конфигурации
Для понимания структуры типовой БП 3.0 полезны материалы:
— описание функциональности БП;
— руководство пользователя;
— описание изменений по релизам;
— документация к подсистемам;
— инструкции по обновлению.Рекомендую посмотреть здесь:
— https://v8.1c.ru/buhv8/
— https://its.1c.ru/db/buhv8
— https://releases.1c.ru/В разделе релизов особенно полезно читать:
— «Новое в релизе»;
— «Изменения законодательства»;
— «Известные проблемы»;
— «Порядок обновления»;
— описание изменений объектов конфигурации.Это помогает понять, почему в типовой БП используется конкретный документ, регистр или общий модуль.
### 2. Стандартные библиотеки
БП 3.0 активно использует БСП, поэтому желательно отдельно изучить:
— общие модули БСП;
— дополнительные отчеты и обработки;
— дополнительные реквизиты;
— печатные формы;
— настройки пользователей;
— вариантность отчетов;
— дополнительные команды;
— фоновые задания;
— стандартные подсистемы.Рекомендую посмотреть здесь:
— https://github.com/1c-spravochnik/bsp
— https://its.1c.ru/db/bsp
— https://v8.1c.ru/library/bsp/Если нужно дорабатывать БП 3.0, знание БСП обязательно. Многие функции в типовой конфигурации не реализованы напрямую в модуле документа, а вызываются через общие модули БСП и подсистемы конфигурации.
## В каком порядке изучать
### Этап 1. Основы платформы
Изучите:
1. Конфигуратор и режим «1С:Предприятие».
2. Справочники.
3. Документы.
4. Перечисления.
5. Регистры сведений.
6. Регистры накопления.
7. Регистры бухгалтерии.
8. Планы счетов.
9. Отчеты и обработки.
10. Формы.
11. Роли и права.
12. Подсистемы.Для практики создайте небольшую учебную конфигурацию, например:
— справочник «Клиенты»;
— справочник «Товары»;
— документ «Продажа»;
— табличную часть товаров;
— регистр накопления «Продажи»;
— отчет по продажам.Без этого сложно эффективно разбираться в БП 3.0.
### Этап 2. Язык 1С и запросы
Отдельно изучите:
— переменные;
— структуры и соответствия;
— массивы;
— менеджеры объектов;
— объектную и табличную модель данных;
— транзакции;
— исключения;
— клиентские и серверные процедуры;
— директивы&НаКлиенте,&НаСервере,&НаСервереБезКонтекста;
— временные таблицы;
— соединения;
— пакетные запросы;
— виртуальные таблицы.Для БП особенно важны запросы к:
— регистрам бухгалтерии;
— регистрам накопления;
— регистрам сведений;
— документам и их табличным частям;
— бухгалтерским итогам.### Этап 3. Изучение типовой БП 3.0
В демонстрационной или копии рабочей базы по очереди изучайте:
1. Документ «Поступление товаров и услуг».
2. Документ «Реализация товаров и услуг».
3. Документ «Списание с расчетного счета».
4. Документ «Поступление на расчетный счет».
5. Документ «Операция, введенная вручную».
6. Документ «Принятие к учету ОС».
7. Документ «Начисление амортизации».
8. Документы по зарплате и налогам.
9. Документы закрытия месяца.
10. Отчеты «Оборотно-сальдовая ведомость» и «Анализ счета».Для каждого документа смотрите:
— форму;
— командный интерфейс;
— модуль объекта;
— модуль формы;
— движения;
— регистры;
— подписки на события;
— общие модули;
— команды;
— проверки заполнения;
— обработчики проведения.Особенно полезно включать:
— замер производительности;
— технологический журнал;
— отладчик;
— просмотр движений документа;
— «Конфигурация» и «Сравнить конфигурации»;
— поиск ссылок на объект.## Какие задачи делать на практике
Лучше обучаться не на абстрактных примерах, а на типовых задачах по БП 3.0.
### Начальный уровень
1. Добавить реквизит в справочник через расширение.
2. Добавить реквизит в документ.
3. Вывести реквизит на форму.
4. Заполнить реквизит по кнопке.
5. Добавить дополнительную команду в форму.
6. Сделать проверку заполнения реквизита.
7. Вывести дополнительный реквизит в печатную форму.
8. Сделать простой отчет на СКД.
9. Добавить отбор по организации.
10. Добавить отбор по контрагенту.### Средний уровень
1. Сделать внешнюю печатную форму.
2. Сделать внешнюю обработку заполнения табличной части.
3. Добавить подписку на событие.
4. Изменить алгоритм заполнения документа через расширение.
5. Получить остатки по регистру накопления.
6. Получить бухгалтерские данные из регистра бухгалтерии.
7. Добавить движения в собственный регистр.
8. Настроить права доступа.
9. Сделать дополнительный отчет через БСП.
10. Добавить механизм проверки перед проведением.### Продвинутый уровень
1. Разобраться с проведением документа БП.
2. Найти источник формирования бухгалтерской проводки.
3. Исследовать закрытие месяца.
4. Сделать корректировку типового алгоритма через расширение.
5. Настроить обмен с другой базой.
6. Исследовать фоновые задания.
7. Оптимизировать медленный запрос.
8. Разобраться с блокировками.
9. Настроить RLS, то есть ограничения доступа на уровне записей.
10. Проверить совместимость доработки с будущим обновлением БП.## Что особенно важно для БП 3.0
### Не начинать с изменения типовой конфигурации
Для учебной базы это допустимо, но в рабочей БП 3.0 лучше использовать:
— расширение конфигурации;
— внешнюю обработку;
— внешнюю печатную форму;
— внешнюю отчетность;
— подписки на события;
— дополнительные реквизиты и сведения;
— стандартные механизмы БСП.Прямое изменение типовой конфигурации усложняет обновления.
### Изучить бухгалтерский регистр
В БП 3.0 проводки обычно формируются не простым ручным заполнением таблицы, а через механизмы проведения документов, планы счетов, регистр бухгалтерии и правила отражения операций.
Нужно понимать:
— что такое счет дебета и кредита;
— субконто;
— виды субконто;
— организация;
— валюта;
— количество;
— суммы;
— содержание проводки;
— регистраторы;
— движения документа;
— виртуальные таблицы регистра бухгалтерии;
— периодичность и итоги.Без основ бухгалтерского учета невозможно качественно дорабатывать проведение документов.
### Изучить структуру БСП
В типовой БП не всегда нужно искать всю логику в модуле формы документа. Часто используются:
— общие модули;
— менеджеры объектов;
— подписки на события;
— расширения;
— программные интерфейсы;
— функциональные опции;
— параметры сеанса;
— настройки пользователя.Поэтому при изучении каждого механизма используйте команду поиска по конфигурации и ищите:
— имя процедуры;
— имя общего модуля;
— имя регистра;
— имя команды;
— имя подписки;
— обращения к объекту.## Оптимальный комплект для обучения
Я бы рекомендовал такой набор:
1. «1С:Предприятие 8.3. Практическое пособие разработчика»
Для базового конфигурирования.2. «Разработка прикладных решений на платформе 1С:Предприятие 8.3»
Для более серьезного понимания архитектуры.3. Документация платформы 1С
https://its.1c.ru/db/v8doc4. Документация по БСП
https://its.1c.ru/db/bsp5. Описание и релизы БП 3.0
https://its.1c.ru/db/buhv86. Видеопоиск по расширениям и разработке БП
https://www.youtube.com/results?search_query=1С+Бухгалтерия+3.0+расширение+конфигурации7. Практические статьи по доработке типовых конфигураций
https://infostart.ru/1c/articles/Главное, не ограничиваться просмотром роликов. После каждой темы делайте такую же доработку в копии БП 3.0: добавьте реквизит, выведите его на форму, создайте команду, сформируйте отчет, найдите движения документа и проверьте результат через отладчик.
9 октября 2026 в 12:18 в ответ на: Как исправить ошибку «Каталог не обнаружен» при отправке HTML-письма? #38836Ошибка:
1С (Код)1Ошибка при вызове метода контекста (Послать): Каталог не обнаруженпри отправке HTML-письма обычно означает, что в письме есть ссылка на файл или вложение, а каталог с этим файлом недоступен на компьютере, где выполняется метод
Почта.Послать().Чаще всего причина находится в одном из трех мест:
1. в HTML указаны картинки через локальный путь;
2. в письмо добавляется вложение по несуществующему пути;
3. код выполняется на сервере, а файл находится на компьютере пользователя.## 1. Проверьте HTML
Неправильно:
XHTML1<img src="C:Templogo.png">или:
XHTML1<img src="file:///C:/Temp/logo.png">Также проблемными будут пути вида:
XHTML1<img src="D:Общие документыlogo.jpg">Когда письмо отправляется, почтовый объект пытается обработать этот путь. Если каталог
C:Temp,D:Общие документыили другой путь отсутствует на компьютере сервера, возникает ошибка «Каталог не обнаружен».Для HTML-письма картинку нужно либо:
— добавить как встроенное вложение с
Content-ID;
— вставить в HTML в формате Base64;
— убрать картинку из HTML;
— разместить картинку на доступном веб-сервере и указать URLhttps://....Пример с внешней ссылкой:
XHTML1<img src="https://example.ru/images/logo.png">Но такая картинка может не отображаться у получателя, если почтовая программа блокирует внешнее содержимое.
## 2. Проверьте добавление обычных вложений
Если используется код вроде:
1С (Код)1Вложение = ПочтовоеСообщение.Вложения.Добавить(ПутьКФайлу);или:
1С (Код)1Вложение = Сообщение.Вложения.Добавить(Новый Файл(ПутьКФайлу));нужно проверить, что файл существует именно там, где выполняется отправка.
Надежная проверка:
1С (Код)12345ФайлВложения = Новый Файл(ПутьКФайлу);Если Не ФайлВложения.Существует() ТогдаВызватьИсключение "Файл вложения не найден: " + ПутьКФайлу;КонецЕсли;Для добавления файла лучше использовать двоичные данные:
1С (Код)12345678910ФайлВложения = Новый Файл(ПутьКФайлу);Если Не ФайлВложения.Существует() ТогдаВызватьИсключение "Файл вложения не найден: " + ПутьКФайлу;КонецЕсли;ДвоичныеДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);Вложение = ПочтовоеСообщение.Вложения.Добавить(ДвоичныеДанныеФайла);Вложение.Имя = ФайлВложения.Имя;Важно: файл не должен быть только на компьютере пользователя, если отправка выполняется на сервере.
## 3. Проверьте серверный и клиентский путь
Например, пользователь выбирает файл:
1С (Код)1C:UsersИвановDocumentsДокумент.pdfНо
Почта.Послать()выполняется на сервере 1С. На сервере такого каталога может не быть. Для сервера путь:1С (Код)1C:UsersИвановDocumentsДокумент.pdfне означает путь к компьютеру пользователя.
В таком случае файл нужно сначала передать на сервер в виде
ДвоичныеДанные, а уже на сервере добавить его в письмо.Пример общей схемы:
1С (Код)1234567891011121314151617181920&НаКлиентеПроцедура ОтправитьПисьмо(Команда)Если Не ЗначениеЗаполнено(ПутьКФайлу) ТогдаСообщить("Не выбран файл.");Возврат;КонецЕсли;Файл = Новый Файл(ПутьКФайлу);Если Не Файл.Существует() ТогдаСообщить("Файл не найден: " + ПутьКФайлу);Возврат;КонецЕсли;ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);ОтправитьПисьмоНаСервере(ДанныеФайла, Файл.Имя);КонецПроцедурыСерверная процедура:
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445&НаСервереПроцедура ОтправитьПисьмоНаСервере(ДанныеФайла, ИмяФайла)Профиль = Новый ИнтернетПочтовыйПрофиль;Профиль.АдресСервераSMTP = "smtp.example.ru";Профиль.ПортSMTP = 465;Профиль.ПользовательSMTP = "user@example.ru";Профиль.ПарольSMTP = "Пароль";Профиль.ИспользоватьSSLSMTP = Истина;Сообщение = Новый ИнтернетПочтовоеСообщение;Сообщение.Тема = "Проверка отправки";Сообщение.Отправитель = "user@example.ru";Сообщение.Получатели.Добавить("recipient@example.ru");ТекстHTML ="<html>" +"<body>" +"<p>Тестовое письмо.</p>" +"</body>" +"</html>";Сообщение.Тексты.Добавить(ТекстHTML,ТипТекстаПочтовогоСообщения.HTML);Вложение = Сообщение.Вложения.Добавить(ДанныеФайла);Вложение.Имя = ИмяФайла;Сообщение.ОбработатьТексты();Почта = Новый ИнтернетПочта;ПопыткаПочта.Подключиться(Профиль);Почта.Послать(Сообщение);ИсключениеТекстОшибки = ОписаниеОшибки();ВызватьИсключение "Ошибка отправки письма: " + ТекстОшибки;КонецПопытки;Почта.Отключиться();КонецПроцедуры## 4. Если в HTML есть картинки, добавляйте их через CID
HTML:
XHTML123456<html><body><p>Добрый день!</p><img src="cid:logo.png"></body></html>Картинку нужно добавить во вложения и назначить ей идентификатор:
1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940414243444546&НаСервереПроцедура ОтправитьHTMLСКартинкойНаСервере(ДанныеЛоготипа)Профиль = Новый ИнтернетПочтовыйПрофиль;Профиль.АдресСервераSMTP = "smtp.example.ru";Профиль.ПортSMTP = 465;Профиль.ПользовательSMTP = "user@example.ru";Профиль.ПарольSMTP = "Пароль";Профиль.ИспользоватьSSLSMTP = Истина;Сообщение = Новый ИнтернетПочтовоеСообщение;Сообщение.Тема = "Письмо с логотипом";Сообщение.Отправитель = "user@example.ru";Сообщение.Получатели.Добавить("recipient@example.ru");HTML ="<html>" +"<body>" +"<p>Добрый день!</p>" +"<img src=""cid:logo.png"">" +"</body>" +"</html>";Вложение = Сообщение.Вложения.Добавить(ДанныеЛоготипа);Вложение.Имя = "logo.png";Вложение.Идентификатор = "logo.png";Сообщение.Тексты.Добавить(HTML,ТипТекстаПочтовогоСообщения.HTML);Сообщение.ОбработатьТексты();Почта = Новый ИнтернетПочта;ПопыткаПочта.Подключиться(Профиль);Почта.Послать(Сообщение);ИсключениеВызватьИсключение ОписаниеОшибки();КонецПопытки;Почта.Отключиться();КонецПроцедурыЕсли картинки формируются объектом
ФорматированныйДокумент, можно получить HTML и картинки черезПолучитьHTML(), а затем заменить ссылки на картинки наcid::1С (Код)12345678910111213141516171819202122232425HTML = "";Картинки = Новый Соответствие;Содержимое.ПолучитьHTML(HTML, Картинки);Для Каждого ЭлементКартинки Из Картинки ЦиклДанныеКартинки = ЭлементКартинки.Значение.ПолучитьДвоичныеДанные();Вложение = Сообщение.Вложения.Добавить(ДанныеКартинки);Вложение.Идентификатор = ЭлементКартинки.Ключ;Вложение.Имя = ЭлементКартинки.Ключ;HTML = СтрЗаменить(HTML,ЭлементКартинки.Ключ,"cid:" + Вложение.Идентификатор);КонецЦикла;Сообщение.Тексты.Добавить(HTML,ТипТекстаПочтовогоСообщения.HTML);## 5. Проверьте временные файлы
Иногда HTML сначала записывается во временный каталог:
1С (Код)1ИмяВременногоФайла = ПолучитьИмяВременногоФайла("html");А потом каталог удаляется до выполнения:
1С (Код)1Почта.Послать(Сообщение);Например, проблемный вариант:
1С (Код)12345678ИмяФайла = ПолучитьИмяВременногоФайла("html");ЗаписатьТекстовыйФайл(ИмяФайла, HTML);// Здесь временный файл удалилиУдалитьФайлы(ИмяФайла);// А здесь почта пытается его прочитатьПочта.Послать(Сообщение);Если файл используется в письме, он должен существовать до завершения
Послать().Проверяйте временный путь:
1С (Код)12345Файл = Новый Файл(ИмяФайла);Сообщить("Путь: " + ИмяФайла);Сообщить("Существует: " + Файл.Существует());Сообщить("Каталог: " + Файл.Путь);Если файл создается на сервере, временный каталог должен существовать именно на сервере 1С.
## 6. Быстрая диагностика
Временно отправьте письмо без HTML-картинок и вложений:
1С (Код)123456789101112131415Сообщение = Новый ИнтернетПочтовоеСообщение;Сообщение.Тема = "Тест";Сообщение.Отправитель = "user@example.ru";Сообщение.Получатели.Добавить("recipient@example.ru");Сообщение.Тексты.Добавить("Простое текстовое письмо",ТипТекстаПочтовогоСообщения.ПростойТекст);Сообщение.ОбработатьТексты();Почта.Подключиться(Профиль);Почта.Послать(Сообщение);Почта.Отключиться();Если простое письмо отправляется, добавляйте элементы по одному:
1. простой текст;
2. HTML без картинок;
3. HTML с одной картинкой;
4. обычное вложение;
5. остальные картинки и файлы.Так будет сразу понятно, какой путь вызывает ошибку.
## На что обратить внимание в вашем коде
Перед строкой:
1С (Код)1Почта.Послать(Сообщение);проверьте:
— нет ли в HTML
src="C:...";
— нет ли в HTMLfile:///...;
— существуют ли все файлы вложений;
— выполняется ли код на клиенте или сервере;
— доступен ли каталог серверу 1С;
— не удаляется ли временный файл раньше времени;
— не содержит ли имя файла недопустимые символы;
— вызывается лиСообщение.ОбработатьТексты()после добавления текста и вложений.В большинстве случаев при HTML-письме ошибка устраняется удалением локальных
srcиз HTML или заменой их на CID-вложения. Если отправка выполняется на сервере, локальные пути компьютера пользователя нужно передавать на сервер какДвоичныеДанные, а не передавать строку с путем.9 октября 2026 в 10:40 в ответ на: Как исправить ошибку «Таблица не найдена НачальноеСальдоПрямыхРасходов» при закр #38833Ошибка:
> Таблица не найдена «НачальноеСальдоПрямыхРасходов»
возникает внутри программного запроса регламентной операции.
НачальноеСальдоПрямыхРасходовв данном случае, скорее всего, является временной таблицей, которую программа должна была сформировать на предыдущем этапе расчета. До обращения к ней таблица не была создана.Это не означает, что в базе отсутствует справочник или регистр с таким названием. Создавать объект с таким именем вручную не нужно.
## Наиболее вероятные причины
1. Ошибка конкретного релиза конфигурации 1С.
2. После обновления конфигурации не был выполнен штатный режим обновления базы данных.
3. Измененный программный код конфигурации, в котором временная таблица создается не во всех ветках алгоритма.
4. Повреждение или некорректное продолжение старого документа «Закрытие месяца».
5. Нарушение последовательности выполнения регламентных операций.
6. Реже, проблема с версией платформы 1С или серверным кэшем.По тексту ошибки это больше похоже на программную ошибку алгоритма закрытия счетов, а не на обычную ошибку в остатках, аналитике или настройках затрат.
## Что сделать в первую очередь
### 1. Зафиксировать релиз конфигурации и платформы
Откройте:
Справка → О программе
Зафиксируйте:
— название конфигурации;
— релиз конфигурации;
— версию платформы;
— режим работы: файловый или клиент-серверский.Особенно важно понять, используется ли:
— «Бухгалтерия предприятия 3.0»;
— «Комплексная автоматизация 2»;
— «ERP Управление предприятием 2»;
— доработанная конфигурация.Алгоритмы закрытия счетов 20, 23, 25, 26, 28 и 29 существенно различаются в БП, КА и ERP.
### 2. Проверить журнал регистрации
Откройте:
Администрирование → Поддержка и обслуживание → Журнал регистрации
Установите отбор:
— период: момент возникновения ошибки;
— уровень: Ошибка;
— пользователь;
— событие, связанное с регламентной операцией.Откройте ошибку полностью. Важны сведения:
— имя общего модуля;
— имя процедуры или функции;
— номер строки;
— полный текст запроса;
— стек вызовов;
— имя конфигурационного объекта.Если в журнале будет указано что-то вроде:
—
ЗакрытиеМесяца;
—РасчетСебестоимости;
—ЗакрытиеСчетов20_23_25_26;
—РаспределениеПроизводственныхЗатрат;то это позволит точно определить проблемный участок.
### 3. Не продолжать закрытие старого документа
Если ошибка возникла в уже созданном документе «Закрытие месяца», выполните следующие действия:
1. Откройте документ закрытия месяца за сентябрь 2026 года.
2. Отмените проведение регламентной операции с ошибкой.
3. Перезапишите документ.
4. При необходимости удалите документ закрытия месяца за сентябрь и создайте его заново штатной командой.
5. Выполните заполнение операций заново.
6. Запустите закрытие месяца повторно.Перед удалением документа обязательно сделайте резервную копию информационной базы.
Если в документе уже были выполнены последующие регламентные операции, сначала отмените их проведение в обратном порядке.
## Проверить обновление конфигурации
Если используется типовая конфигурация, первое практическое решение, которое следует выполнить, это обновить ее до актуального релиза.
Порядок:
1. Сделать резервную копию базы.
2. Проверить наличие обновления для текущей конфигурации.
3. Выполнить обновление конфигурации.
4. Запустить базу в режиме предприятия.
5. Повторно создать или перезаполнить документ закрытия месяца.
6. Повторить закрытие сентября 2026 года.После обновления проверьте, что версия конфигурации действительно изменилась. Иногда обновляют только платформу, хотя ошибка находится в коде конфигурации.
Также проверьте, не используется ли старая платформа. Для новых релизов БП, КА и ERP фирма 1С часто устанавливает минимально допустимую версию платформы.
## Если конфигурация доработанная
Если конфигурация изменена, необходимо проверить программный код.
В конфигураторе выполните поиск по конфигурации строки:
1С (Код)1НачальноеСальдоПрямыхРасходовНужно найти два участка:
1. место, где временная таблица создается;
2. место, где она используется.Перед использованием временной таблицы должен выполняться запрос или фрагмент пакетного запроса, создающий ее через
ПОМЕСТИТЬ. Условно логика должна быть такой:1С (Код)1234567891011121314Запрос = Новый Запрос;Запрос.Текст = "|ВЫБРАТЬ| ...|ПОМЕСТИТЬ НачальноеСальдоПрямыхРасходов|ИЗ| ...|;||ВЫБРАТЬ| ...|ИЗ| НачальноеСальдоПрямыхРасходов КАК Расходы|";Типовая ошибка в доработанном коде выглядит так:
— блок с созданием таблицы выполняется только при определенном условии;
— блок с использованием таблицы выполняется всегда;
— в результате временная таблица не существует.Например, создание таблицы может быть ошибочно помещено внутрь условия, связанного с наличием НЗП, производственных подразделений или прямых расходов.
В таком случае нужно не просто добавить пустую таблицу, а проверить сам алгоритм формирования начального сальдо прямых расходов.
## Проверить, не повреждена ли типовая конфигурация
Если конфигурация должна быть типовой, но при поиске обнаруживаются изменения, выполните:
Конфигуратор → Конфигурация → Поддержка → Настройка поддержки
Проверьте:
— является ли конфигурация типовой;
— есть ли измененные объекты;
— изменены ли общие модули, отвечающие за закрытие месяца;
— не сняты ли с поддержки процедуры расчета себестоимости.Особое внимание следует обратить на общие модули, связанные с:
— закрытием месяца;
— производственными расходами;
— расчетом себестоимости;
— распределением расходов;
— регламентными операциями;
— расчетом НЗП.Если типовой общий модуль был изменен, сравните его с поставщиком и верните типовой код либо перенесите доработку корректно.
## Что проверить в учете после устранения программной ошибки
Хотя сама ошибка имеет программный характер, перед повторным закрытием желательно проверить данные за сентябрь 2026 года:
1. Выполнить перепроведение первичных документов за сентябрь.
2. В КА, ERP или УПП восстановить последовательность по операциям приобретения, реализации и себестоимости.
3. Проверить отрицательные остатки по товарам и материалам.
4. Проверить ОСВ по счетам:
— 20;
— 23;
— 25;
— 26;
— 28;
— 29.
5. Проверить отсутствие пустой аналитики по подразделениям, номенклатурным группам и статьям затрат.
6. Проверить настройки распределения косвенных расходов.
7. Проверить порядок подразделений для закрытия счетов, если он задается вручную.
8. Проверить документы рабочего места Распределение расходов, если используется КА или ERP.
9. Повторно выполнить регламентные операции в установленном порядке.В БП проверьте:
Главное → Учетная политика → Методы распределения косвенных расходов
В КА и ERP проверьте:
Финансовый результат и контроллинг → Доходы и расходы → Распределение расходов
а также:
Производство → Распределение расходов
Если есть статус «Требуется сформировать документ» или «Ошибка распределения», сначала необходимо обработать его.
## Если обновление не помогло
Если конфигурация типовая, релиз актуальный, а ошибка повторяется, выполните проверку в копии базы:
1. Создайте копию информационной базы.
2. В копии отмените проведение документа закрытия сентября.
3. Перепроведите документы производственного блока за месяц.
4. Создайте новый документ закрытия месяца.
5. Повторите операцию.Если в копии ошибка повторяется на чистом новом документе, почти наверняка это ошибка релиза или платформы.
Если ошибка возникает только в рабочей базе, следует проверить:
— изменения конфигурации;
— расширения;
— подключенные внешние обработки;
— дополнительные общие модули;
— права пользователя;
— регламентные задания;
— повреждение кэша.Для клиент-серверной базы дополнительно можно перезапустить службы 1С после резервного копирования и проверить ошибку повторно. Очистка кэша может устранить только ошибку выполнения старого скомпилированного кода, но не исправит ошибку в самом алгоритме.
## Чего делать не следует
Не следует:
— создавать вручную регистр или справочник
НачальноеСальдоПрямыхРасходов;
— исправлять проводки ручной операцией только для обхода ошибки;
— удалять движения регламентных документов напрямую из базы;
— многократно нажимать «Выполнить» без анализа журнала регистрации;
— менять настройки учета наугад;
— выполнять «Тестирование и исправление» на рабочей базе без резервной копии.Для этой ошибки основной порядок решения такой:
1. получить полный стек из журнала регистрации;
2. определить релиз конфигурации и платформы;
3. проверить обновление;
4. пересоздать документ закрытия месяца;
5. если база измененная, проверить создание временной таблицы в коде;
6. только после этого проверять производственные остатки и настройки распределения расходов.Рекомендую посмотреть здесь:
— [Типичные ошибки в регламентных операциях закрытия месяца в 1С:КА 2 и ERP 2](https://infostart.ru/1c/articles/2100806/)
— [Регламентные операции закрытия месяца](https://infostart.ru/1c/articles/203645/)В КА 2.5.27.68 команда «Получить GS46» в обработке «Подготовка сведений для Национального каталога» не генерирует код внутри 1С. Она отправляет запрос в Национальный каталог и получает код, присвоенный товару внешним сервисом.
Под GS46 в данном механизме обычно понимается идентификатор товара GS1, который возвращается Национальным каталогом после обработки карточки. Для маркируемых товаров этот код используется как основа для GTIN и дальнейшего формирования кодов маркировки.
## Как работает получение GS46
Общий порядок такой:
1. В КА создается или выбирается номенклатура.
2. В обработке «Подготовка сведений для Национального каталога» формируются сведения о товаре.
3. Заполняются обязательные характеристики:
— производитель;
— страна производства;
— бренд;
— вид продукции;
— наименование;
— товарная категория;
— потребительские характеристики;
— единица измерения;
— упаковка;
— вес или объем, если требуются для конкретной категории;
— сведения о документе, подтверждающем характеристики товара.
4. Сведения выгружаются в Национальный каталог.
5. Национальный каталог проверяет карточку.
6. После успешной обработки выполняется команда «Получить GS46».
7. 1С отправляет запрос по загруженным товарам.
8. Полученный идентификатор записывается обратно в карточку номенклатуры или в сведения, связанные с номенклатурой.Сам код при этом не рассчитывается по формуле на стороне 1С. Если Национальный каталог еще не принял карточку, получить GS46 не получится.
## Что нужно сделать в обработке
Обычно порядок действий следующий:
### 1. Сформировать список товаров
В обработке укажите:
— организацию;
— номенклатуру;
— вид продукции или товарную категорию;
— товары, которые требуется передать.Проверьте, что в список попали именно элементы номенклатуры, а не группы и не дубли.
### 2. Заполнить сведения о товарах
По каждой строке проверьте состояние заполнения. Особое внимание:
— производителю;
— бренду;
— стране происхождения;
— характеристикам;
— назначению товара;
— единицам измерения;
— упаковкам;
— кодам ТН ВЭД или ОКПД2, если они обязательны для категории;
— фотографиям и описанию, если они требуются Национальным каталогом.Состав обязательных реквизитов зависит от товарной группы. Для разных категорий перечень характеристик отличается.
### 3. Выполнить проверку
До выгрузки используйте команду проверки заполнения. Если имеются ошибки, сначала исправьте их в карточках Номенклатуры или непосредственно в подготовленных сведениях.
Важно: наличие заполненного наименования и артикула само по себе недостаточно. Национальный каталог идентифицирует товар по совокупности сведений, а не только по наименованию.
### 4. Отправить сведения
Выполните команду выгрузки или передачи сведений в Национальный каталог.
После этого у товара обычно появляется состояние, например:
— сведения подготовлены;
— отправлены;
— приняты;
— отклонены;
— обработка выполняется;
— требуется исправление.Нужно дождаться состояния, при котором карточка принята Национальным каталогом. Сразу после отправки команда получения кода может вернуть пустой результат, поскольку обработка выполняется асинхронно.
### 5. Обновить статусы
Выполните команду получения или обновления состояний товаров. После этого повторно откройте список подготовленных сведений.
Для товаров, которые приняты, станет доступна команда «Получить GS46».
### 6. Получить GS46
Выделите нужные товары и нажмите «Получить GS46».
Обработка отправит запрос в Национальный каталог. Возможны следующие результаты:
— код получен и записан в 1С;
— код уже был получен ранее;
— товар еще находится в обработке;
— карточка отклонена;
— по товару не найдена подходящая карточка;
— не заполнены обязательные реквизиты;
— отсутствует связь с Национальным каталогом;
— не хватает прав или закончилась авторизация.После успешного получения нужно обновить форму и проверить карточку номенклатуры. Код может находиться не в обычном реквизите карточки, а в сведениях, связанных с национальным каталогом, в зависимости от установленного релиза и используемой функциональности.
## Почему GS46 не получается
Наиболее частые причины следующие.
### Товар еще не принят Национальным каталогом
Если товар только что выгружен, сначала нужно обновить его статус. Команда «Получить GS46» не заменяет передачу карточки и не запускает ее проверку заново.
### Карточка отклонена
В этом случае сначала нужно открыть протокол обработки и исправить причину отказа. Часто отклонение вызывают:
— неверная товарная категория;
— отсутствует производитель;
— не заполнен бренд;
— не указана страна производства;
— некорректная единица измерения;
— не заполнены обязательные характеристики;
— характеристики указаны в неверном формате;
— дублирование карточки;
— расхождение данных с уже существующей карточкой товара.После исправления нужно повторно отправить сведения и дождаться нового статуса.
### В 1С нет актуального статуса
Иногда Национальный каталог уже обработал товар, но 1С еще не получила результат. В этом случае:
1. обновите состояния товаров;
2. закройте и заново откройте обработку;
3. повторите получение GS46;
4. проверьте журнал регистрации, если команда завершается ошибкой.### Не настроено подключение
Проверьте:
— подключение к сервису Национального каталога;
— учетную запись организации;
— сертификат электронной подписи;
— срок действия сертификата;
— права пользователя;
— токен или авторизационные данные;
— соответствие организации в 1С организации, зарегистрированной в Национальном каталоге.Если используется электронная подпись, также проверьте, что сертификат доступен на сервере 1С, а не только на локальном компьютере пользователя.
### Выбрана не та организация
GS46 получается в контексте участника оборота и организации. Если в обработке указана другая организация, товары могут не находиться или сервис может возвращать ошибку доступа.
### Номенклатура уже содержит аналогичный код
Если товар ранее был передан из другой базы или код уже был получен вручную, повторное получение может не вернуть новый код. В такой ситуации нужно проверить:
— идентификатор товара в Национальном каталоге;
— GTIN;
— состояние карточки;
— связь элемента Номенклатуры с карточкой Национального каталога.Не следует создавать новую карточку и повторно запрашивать код только из-за того, что код не отображается в привычной форме. Сначала нужно проверить состояние обмена и данные товара.
## Важное различие между GS46, GTIN и кодом маркировки
Это разные сущности:
— GS46: идентификатор, который запрашивается через механизм работы с Национальным каталогом;
— GTIN: глобальный номер торговой единицы, используемый для идентификации товара;
— код маркировки: конкретный уникальный код экземпляра товара или упаковки, который заказывается через систему маркировки;
— DataMatrix: графическое представление кода маркировки.Получение GS46 не означает, что товар уже промаркирован. После получения идентификатора могут потребоваться дополнительные действия:
1. зарегистрировать или связать карточку товара;
2. получить или подтвердить GTIN;
3. заказать коды маркировки;
4. ввести коды в оборот;
5. использовать коды в приемке, продаже и других операциях.## Практическая последовательность для вашей версии КА
Для КА 2.5.27.68 ориентируйтесь на такую последовательность:
1. Откройте НСИ и администрирование.
2. Перейдите в раздел работы с маркировкой и Национальным каталогом.
3. Откройте «Подготовка сведений для Национального каталога».
4. Загрузите или добавьте номенклатуру.
5. Выполните проверку заполнения.
6. Исправьте все ошибки.
7. Передайте сведения в Национальный каталог.
8. Обновите статусы обработки.
9. Убедитесь, что товар принят, а не отклонен и не находится в обработке.
10. Выделите принятые товары.
11. Выполните «Получить GS46».
12. Обновите форму и проверьте записанный идентификатор.
13. Если код не получен, откройте протокол обмена и журнал регистрации.Если обработка показывает «товар не найден», «не готов к получению GS46» или аналогичное сообщение, это обычно означает не ошибку расчета кода, а то, что карточка еще не имеет положительного результата обработки в Национальном каталоге.
8 октября 2026 в 17:18 в ответ на: Как выгрузить данные по номенклатуре и получить GTIN в 1С:КА 2.5.27.68? #38829В 1С:КА 2.5.27.68 GTIN обычно не является обычным реквизитом справочника «Номенклатура». Он хранится в регистрах, связанных с номенклатурой, характеристикой и упаковкой.
Для выгрузки нужно определить, где именно GTIN заполнен в вашей базе.
## Вариант 1. Получить GTIN через «Универсальный отчет»
1. Откройте раздел:
НСИ и администрирование → Печатные формы, отчеты и обработки → Универсальный отчет
В некоторых интерфейсах пункт может находиться в разделе:
НСИ и администрирование → Настройки и справочники → Универсальный отчет
2. В поле Тип объекта выберите:
Регистр сведений
3. В поле Имя объекта попробуйте выбрать:
Штрихкоды номенклатуры
4. Добавьте в настройки отчета поля:
— Номенклатура
— Характеристика
— Упаковка
— Штрихкод
— Вид штрихкода, если такое поле доступно
— Владелец штрихкода, если оно есть в вашей версии5. Нажмите Сформировать.
6. Полученный отчет сохраните через кнопку:
Еще → Сохранить результат
или воспользуйтесь кнопкой сохранения в Excel.
Результат обычно будет содержать примерно такие данные:
| Номенклатура | Характеристика | Упаковка | Штрихкод |
|—|—|—|—|
| Кроссовки | 42 размер | шт | 04612345678901 |
| Кроссовки | 43 размер | шт | 04612345678918 |В зависимости от настроек учета характеристика и упаковка могут отсутствовать.
## Вариант 2. Получить именно GTIN маркированного товара
Если нужны не все штрихкоды, а именно GTIN из системы маркировки, дополнительно проверьте регистр:
— Коды товаров
— Коды маркировки
— Штрихкоды номенклатуры
— Номенклатура и характеристики с кодами, если такой вариант доступен в универсальном отчетеНазвания могут немного отличаться в зависимости от включенной функциональности и состава конфигурации.
В универсальном отчете выберите регистр Коды товаров и выведите поля:
— Номенклатура
— Характеристика
— Упаковка
— Код товара
— Вид кода
— GTIN, если такое поле присутствует
— Дата начала действияВ этом регистре код может называться не
GTIN, аКод товара. Для маркируемой продукции это и будет код товара, полученный из национального каталога или Честного знака.## Вариант 3. Выгрузить номенклатуру и штрихкоды одним отчетом
Если в универсальном отчете нужно получить одновременно реквизиты номенклатуры и штрихкоды:
1. В качестве объекта отчета выберите регистр Штрихкоды номенклатуры.
2. В настройках полей раскройте поля, связанные с номенклатурой.
3. Добавьте:— Номенклатура.Наименование
— Номенклатура.Код
— Номенклатура.Артикул
— Номенклатура.ВидНоменклатуры
— Характеристика
— Упаковка
— Штрихкод4. При необходимости установите отбор:
— Вид номенклатуры
— Группа номенклатуры
— Организация
— Только маркируемая продукция
— Только заполненные штрихкоды5. Сформируйте отчет и сохраните его в Excel.
Важный момент: если выводить только справочник Номенклатура, GTIN в результате не появится, потому что штрихкоды и коды товаров хранятся отдельно от справочника.
## Вариант 4. Через консоль запросов
Если у вас есть доступ к «Консоли запросов» или нужно сделать внешнюю обработку, можно использовать запрос к регистру штрихкодов.
Название регистра в конфигурации необходимо проверить в режиме Конфигуратор, потому что в пользовательском режиме оно может отображаться с пробелами, а в запросе используется имя метаданных без пробелов.
Пример для регистра
ШтрихкодыНоменклатуры:1С (Код)1234567891011121314151617|ВЫБРАТЬ| Штрихкоды.Номенклатура КАК Номенклатура,| Штрихкоды.Номенклатура.Наименование КАК Наименование,| Штрихкоды.Номенклатура.Код КАК КодНоменклатуры,| Штрихкоды.Номенклатура.Артикул КАК Артикул,| Штрихкоды.Характеристика КАК Характеристика,| Штрихкоды.Упаковка КАК Упаковка,| Штрихкоды.Штрихкод КАК Штрихкод|ИЗ| РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды|ГДЕ| НЕ Штрихкоды.Штрихкод ЕСТЬ NULL| И Штрихкоды.Штрихкод <> ""|УПОРЯДОЧИТЬ ПО| Наименование,| Характеристика,| УпаковкаЕсли в вашей базе нет поля
УпаковкаилиХарактеристика, их нужно удалить из запроса.Если регистр называется иначе, запрос нужно адаптировать, например для регистра
КодыТоваров:1С (Код)123456789101112131415161718|ВЫБРАТЬ| КодыТоваров.Номенклатура КАК Номенклатура,| КодыТоваров.Номенклатура.Наименование КАК Наименование,| КодыТоваров.Номенклатура.Код КАК КодНоменклатуры,| КодыТоваров.Номенклатура.Артикул КАК Артикул,| КодыТоваров.Характеристика КАК Характеристика,| КодыТоваров.Упаковка КАК Упаковка,| КодыТоваров.КодТовара КАК КодТовара,| КодыТоваров.ВидКода КАК ВидКода|ИЗ| РегистрСведений.КодыТоваров КАК КодыТоваров|ГДЕ| НЕ КодыТоваров.КодТовара ЕСТЬ NULL| И КодыТоваров.КодТовара <> ""|УПОРЯДОЧИТЬ ПО| Наименование,| Характеристика,| УпаковкаТочное имя полей нужно проверить в конструкторе запроса. В разных версиях КА поле может называться:
—
КодТовара
—GTIN
—Код
—Штрихкод
—КодТовараНациональногоКаталога## Как отличить GTIN от обычного штрихкода
GTIN может иметь длину:
— 8 символов, GTIN-8
— 12 символов, GTIN-12
— 13 символов, GTIN-13
— 14 символов, GTIN-14В 1С штрихкод часто отображается как EAN-13, например:
1С (Код)14612345678906Для передачи в некоторых системах GTIN требуется формат из 14 цифр:
1С (Код)1004612345678906То есть к EAN-13 добавляется один ведущий ноль.
Но автоматически добавлять ноль ко всем значениям нельзя. Сначала нужно определить, в каком формате код хранится и куда он будет загружаться. Если в базе уже хранится GTIN-14, добавление нуля приведет к неправильному коду.
Для проверки длины в отчете Excel можно использовать формулу:
1С (Код)1=ДЛСТР(A2)Если исходный код числовой, Excel может удалить ведущие нули. Поэтому колонку с GTIN лучше заранее установить в формат Текстовый.
## Если GTIN не найден
Проверьте карточку номенклатуры:
1. Откройте НСИ и администрирование → НСИ → Номенклатура.
2. Откройте нужный товар.
3. Проверьте:— Вид номенклатуры
— Признак маркируемой продукции
— Раздел с кодами товаров
— Штрихкоды
— Характеристики
— УпаковкиДля маркируемых товаров GTIN часто связан не только с номенклатурой, но и с характеристикой. Например, разные размеры обуви могут иметь разные GTIN:
| Номенклатура | Характеристика | GTIN |
|—|—|—|
| Кроссовки F7020 | 42 | 04660083016884 |
| Кроссовки F7020 | 43 | 04660083016891 |Поэтому при выгрузке нельзя ограничиваться только полем
Номенклатура. Обязательно выводитеХарактеристика, а при использовании упаковок такжеУпаковка.## Наиболее надежный вариант для вашей задачи
Для первоначальной выгрузки рекомендую сформировать два отчета:
1. По регистру Штрихкоды номенклатуры:
— Номенклатура
— Код
— Артикул
— Характеристика
— Упаковка
— Штрихкод2. По регистру Коды товаров или аналогичному регистру кодов маркировки:
— Номенклатура
— Характеристика
— Упаковка
— Код товара или GTIN
— Вид кодаЗатем сопоставить их по комбинации:
1С (Код)1Номенклатура + Характеристика + УпаковкаСопоставлять только по наименованию нельзя, поскольку у одной номенклатуры могут быть разные характеристики, упаковки и GTIN.
8 октября 2026 в 16:17 в ответ на: Как в 1С передать «КредитныйЛимит» без изменения конфигурации? #38827Да, такую доработку можно выполнить без изменения основной конфигурации и без использования КД3.1.
Для этого в обеих базах нужно создать расширение конфигурации, в котором:
1. Добавить реквизит
КредитныйЛимитв справочникКонтрагенты.
2. Расширить правила формирования EnterpriseData.
3. При выгрузке помещать значение в дополнительную область универсального формата.
4. При загрузке извлекать значение и записывать его в реквизит контрагента.
5. Подключить одинаковую версию расширения формата в обеих базах.Для одного дополнительного реквизита не требуется изменять стандартную XDTO-схему EnterpriseData. Оптимальный вариант, предусмотренный архитектурой универсального формата, это передавать значение через
AdditionalInfo, то есть через дополнительные сведения объекта. Это и есть расширение передаваемых данных без изменения основной конфигурации и стандартного формата.## 1. Что должно быть в обеих базах
В источнике и приемнике должны быть одинаково созданы:
— реквизит справочника
Контрагенты.КредитныйЛимит;
— тип реквизита, например:
— число, длина 15;
— точность 2;
— неотрицательное значение;
— расширение конфигурации с одинаковым идентификатором расширения;
— обработчики обмена;
— ключ дополнительного свойства, напримерКредитныйЛимит.Если реквизит уже добавлен в обе основные конфигурации, повторно добавлять его в расширение не нужно. В расширении потребуется только доработка обмена.
## 2. Почему не нужно менять стандартную схему EnterpriseData
Стандартный формат EnterpriseData не следует изменять напрямую.
Если добавить новый элемент непосредственно в типовой XDTO-пакет
EnterpriseData, то возникнут проблемы:— конфигурация будет снята с поддержки;
— при обновлении типовой конфигурации изменения могут быть потеряны;
— другая база может не распознать измененную схему;
— потребуется синхронно обновлять структуру формата в обеих базах;
— стандартный менеджер обмена может игнорировать новый узел.Для пользовательских реквизитов в EnterpriseData обычно используется дополнительная информация объекта. В ней можно передать реквизит, которого нет в типовом формате.
В XML обмена логика будет примерно следующая:
1С (Код)123456<AdditionalInfo><Property><Name>КредитныйЛимит</Name><Value>500000.00</Value></Property></AdditionalInfo>Конкретное XML-представление зависит от версии EnterpriseData и реализации менеджера обмена в конкретной конфигурации. Вручную изменять XML-файл обмена не нужно.
## 3. Структура расширения
В расширении рекомендуется создать общий модуль, например:
1С (Код)1ОбменКонтрагентыРасширениеНастройки общего модуля:
— Сервер: Да;
— Вызов сервера: Да;
— Клиент: при необходимости;
— Глобальный: обычно Нет;
— Экспорт: только для процедур, которые вызываются механизмом обмена.Также в расширении нужно расширить общий модуль, который отвечает за обмен через универсальный формат. Его имя зависит от конфигурации и версии формата. В типовых конфигурациях это может быть общий модуль с наименованием, содержащим:
1С (Код)1МенеджерОбменаЧерезУниверсальныйФорматили модуль, имя которого определяется процедурой:
1С (Код)1ДоступныеВерсииУниверсальногоФорматаСначала в конфигураторе нужно найти общий модуль, соответствующий используемой версии EnterpriseData.
## 4. Вариант передачи через AdditionalInfo
Нужно использовать отдельное имя свойства, например:
1С (Код)1КредитныйЛимитЛучше добавить префикс организации, чтобы не пересечься с будущими типовыми свойствами:
1С (Код)1MyCompany.КредитныйЛимитНапример:
1С (Код)1ИмяСвойства = "MyCompany.КредитныйЛимит";Значение необходимо передавать в числовом виде, а не в локализованной строке. Нельзя формировать значение так:
1С (Код)1Строка(Объект.КредитныйЛимит)В зависимости от региональных настроек это может дать:
1С (Код)1500 000,25или:
1С (Код)1500,000.25При разборе в другой базе такая строка может быть обработана неправильно.
Лучше использовать тип значения, поддерживаемый механизмом дополнительных свойств EnterpriseData, либо выполнять преобразование в число с учетом формата, принятого в конкретной версии менеджера обмена.
## 5. Обработка выгрузки
При формировании объекта
Контрагентнужно добавить в его дополнительные сведения значение реквизитаКредитныйЛимит.Логика должна быть следующей:
1С (Код)123456789101112131415Если ТипЗнч(ОбъектИсточник) = Тип("СправочникСсылка.Контрагенты") ТогдаЗначениеКредитногоЛимита = ОбъектИсточник.КредитныйЛимит;Если ЗначениеКредитногоЛимита <> Неопределено ТогдаДобавитьДополнительноеСвойство(ОбъектEnterpriseData,"MyCompany.КредитныйЛимит",ЗначениеКредитногоЛимита);КонецЕсли;КонецЕсли;Процедура
ДобавитьДополнительноеСвойствов приведенном примере является условной. В реальном расширении ее нужно заменить на процедуру, структуру или метод, используемый конкретным менеджером универсального формата.В некоторых конфигурациях дополнительные свойства представлены не структурой, а массивом или таблицей значений. Тогда логика будет выглядеть так:
1С (Код)1234567НоваяДопИнформация = Новый Структура;НоваяДопИнформация.Вставить("Имя", "MyCompany.КредитныйЛимит");НоваяДопИнформация.Вставить("Значение", ЗначениеКредитногоЛимита);ОбъектEnterpriseData.ДополнительнаяИнформация.Добавить(НоваяДопИнформация);Либо:
1С (Код)12345678910111213ДополнительноеСвойство = Новый Структура;ДополнительноеСвойство.Вставить("Ключ","MyCompany.КредитныйЛимит");ДополнительноеСвойство.Вставить("Значение",ОбъектИсточник.КредитныйЛимит);МассивДополнительнойИнформации.Добавить(ДополнительноеСвойство);Точный вариант зависит от того, как в данной конфигурации реализована работа с
AdditionalInfo.## 6. Обработка загрузки
При загрузке данных из EnterpriseData нужно:
1. определить, что загружается объект
Контрагент;
2. найти дополнительное свойствоMyCompany.КредитныйЛимит;
3. проверить его тип и значение;
4. записать значение вОбъектПриемник.КредитныйЛимит.Общая логика:
1С (Код)1234567891011121314151617181920Если ТипЗнч(ОбъектПриемник) = Тип("СправочникОбъект.Контрагенты") ТогдаЗначениеДополнительногоСвойства =НайтиДополнительноеСвойство(ОбъектEnterpriseData,"MyCompany.КредитныйЛимит");Если ЗначениеДополнительногоСвойства <> Неопределено ТогдаЕсли ЗначениеДополнительногоСвойства = "" ТогдаОбъектПриемник.КредитныйЛимит = 0;ИначеОбъектПриемник.КредитныйЛимит =Число(ЗначениеДополнительногоСвойства);КонецЕсли;КонецЕсли;КонецЕсли;Также необходимо ограничить значение точностью реквизита:
1С (Код)12345678910ЗначениеЛимита = Число(ЗначениеДополнительногоСвойства);Если ЗначениеЛимита < 0 ТогдаЗначениеЛимита = 0;КонецЕсли;ОбъектПриемник.КредитныйЛимит = Окр(ЗначениеЛимита,2);Если по бизнес-логике
0означает отсутствие кредитного лимита, можно записывать ноль. Если нужно различать «лимит не задан» и «лимит равен нулю», реквизит должен допускать такую логику отдельно, поскольку числовой реквизит сам по себе не хранитНеопределенокак обычное значение базы.## 7. Где размещать обработчики в расширении
Есть два варианта.
### Вариант 1. Расширение общего модуля
Если используемая конфигурация позволяет расширять процедуры менеджера обмена, в расширении создается расширение общего модуля типового менеджера обмена.
В нем подключаются обработчики к процедурам типового модуля через аннотации расширения:
1С (Код)123456789&После("ИмяТиповойПроцедуры")Процедура Расширение_ПослеФормированияКонтрагента(СтруктураДанных,ОбъектИсточник)// Добавление КредитногоЛимитаКонецПроцедурыДля загрузки:
1С (Код)123456789&После("ИмяТиповойПроцедурыЗагрузки")Процедура Расширение_ПослеПодготовкиКонтрагента(ОбъектПриемник,СтруктураДанных)// Чтение КредитногоЛимитаКонецПроцедурыНазвания
ИмяТиповойПроцедурыиИмяТиповойПроцедурыЗагрузкиздесь условные. Их нельзя переносить в конфигурацию буквально. Нужно открыть общий модуль конкретной конфигурации и выбрать фактические процедуры, вызываемые:— перед формированием объекта EnterpriseData;
— после формирования объекта EnterpriseData;
— перед записью объекта в информационную базу;
— после разбора входящего объекта.### Вариант 2. Собственный менеджер обмена в расширении
Если типовой менеджер обмена не имеет подходящих точек расширения, в расширении можно создать собственный внешний менеджер обмена.
Типовая конфигурация БП и другие конфигурации на БСП обычно позволяют указать менеджер обмена через универсальный формат во внешней обработке. Тогда:
1. В расширении создается общий модуль с логикой обмена.
2. Его код помещается во внешнюю обработку.
3. В настройке синхронизации в поле менеджера обмена указывается эта обработка.
4. Основная конфигурация при этом не изменяется.В некоторых конфигурациях вкладка с путем к менеджеру обмена скрыта. Ее можно включить через:
1С (Код)1234Настройка синхронизации данных→ Еще→ Изменить форму→ Служебная информацияПосле этого указывается путь к внешнему менеджеру обмена.
Однако этот вариант нужно применять только в том случае, если расширение типового общего модуля не позволяет перехватить нужные этапы обмена.
## 8. Как определить реальные точки расширения
В конфигураторе нужно выполнить следующие действия.
### В источнике
Найти общий модуль менеджера универсального формата и определить процедуру, которая формирует объект
Контрагент.Нужно искать код, где встречаются:
1С (Код)1Контрагент1С (Код)1СправочникСсылка.Контрагенты1С (Код)1СправочникОбъект.Контрагенты1С (Код)1EnterpriseData1С (Код)1ДополнительнаяИнформация1С (Код)1AdditionalInfo### В приемнике
Найти процедуру, которая получает объект формата и создает или изменяет объект:
1С (Код)1СправочникОбъект.КонтрагентыИменно в этот момент следует заполнить:
1С (Код)1ОбъектПриемник.КредитныйЛимитНельзя просто добавить реквизит в структуру соответствия. Если типовой менеджер не знает этот реквизит, он его проигнорирует. Значение должно быть явно включено в формируемые дополнительные данные и явно обработано при загрузке.
## 9. Если требуется именно отдельная XDTO-структура
Если под «расширением формата» требуется не
AdditionalInfo, а отдельный XML-элемент с собственной XDTO-схемой, тогда используется другой вариант.В расширении создается собственный XDTO-пакет, например:
1С (Код)1MyCompanyEnterpriseDataExtensionДля него задается уникальное пространство имен:
1С (Код)1http://mycompany.ru/EnterpriseData/Extension/1.0В пакете описывается тип:
1С (Код)1CounterpartyExtensionс элементом:
1С (Код)1CreditLimitТип элемента:
1С (Код)1decimalПосле этого в расширении необходимо:
1. Добавить XDTO-пакет.
2. Определить типCounterpartyExtension.
3. ДобавитьCreditLimitс числовым типом.
4. В обработчике выгрузки создавать объект XDTO этого типа.
5. Добавлять его в расширенную часть данных контрагента.
6. В обработчике загрузки получать этот объект.
7. ПреобразовыватьCreditLimitв число.
8. Записывать значение вКонтрагенты.КредитныйЛимит.Но такой вариант зависит от конкретной версии EnterpriseData и от того, предоставляет ли текущая конфигурация расширяемую точку для добавления пользовательского XDTO-объекта. Одного добавления XDTO-пакета в расширение недостаточно. Типовой менеджер обмена не начнет автоматически его выгружать и загружать.
Поэтому для одного реквизита
КредитныйЛимитправильнее использоватьAdditionalInfo. Если же необходимо, чтобы сторонние системы видели отдельный XML-элемент, тогда потребуется полноценное расширение схемы и ручное расширение менеджера обмена.## 10. Регистрация изменений
Чтобы изменение
КредитныйЛимитинициировало обмен, недостаточно только передавать реквизит при выгрузке.Нужно проверить план обмена:
1С (Код)1Синхронизация данных через универсальный форматили другой план, используемый конкретной конфигурацией.
В состав плана обмена уже должен входить справочник:
1С (Код)1КонтрагентыЕсли изменение реквизита не регистрируется, возможна ситуация:
— контрагент был изменен только по
КредитныйЛимит;
— объект не попал в очередь изменений;
— обмен не выгрузил контрагента;
— в приемнике старое значение.Для типовых планов обмена обычно достаточно того, что объект
Контрагентывключен в состав плана. Если в конфигурации используется выборочная регистрация реквизитов, нужно добавитьКредитныйЛимитв логику регистрации изменений.Проверить это можно следующим образом:
1. Изменить
КредитныйЛимиту контрагента.
2. Записать элемент.
3. Открыть записи регистрации изменений.
4. Убедиться, что контрагент зарегистрирован для нужного узла обмена.
5. Выполнить выгрузку.
6. Проверить, что объект попал в пакет обмена.Если контрагент не зарегистрирован, нужно расширять правила регистрации изменений в расширении.
## 11. Обработка при повторной загрузке
При загрузке следует учитывать несколько случаев:
— свойство отсутствует в старом файле обмена;
— свойство передано пустым;
— передан ноль;
— передано отрицательное значение;
— значение имеет больше знаков после запятой;
— значение невозможно преобразовать в число.Безопасный вариант:
1С (Код)123456789101112131415Если ЗначениеСвойства <> Неопределено ТогдаПопыткаЛимит = Число(ЗначениеСвойства);ИсключениеЛимит = 0;КонецПопытки;Если Лимит < 0 ТогдаЛимит = 0;КонецЕсли;ОбъектПриемник.КредитныйЛимит = Окр(Лимит, 2);КонецЕсли;Если свойство отсутствует, старое значение лучше не затирать:
1С (Код)123Если СвойствоНайдено ТогдаОбъектПриемник.КредитныйЛимит = НовоеЗначение;КонецЕсли;Это важно для совместимости со старыми пакетами обмена, которые были сформированы до установки расширения.
## 12. Что необходимо сделать в каждой базе
### В базе-источнике
1. Установить расширение.
2. Проверить наличие реквизитаКредитныйЛимит.
3. Подключить обработчик выгрузки.
4. ДобавитьКредитныйЛимитвAdditionalInfo.
5. Проверить регистрацию изменения контрагента.
6. Выполнить тестовую выгрузку.
7. Проверить наличие дополнительного свойства в пакете обмена.### В базе-приемнике
1. Установить такое же расширение.
2. Проверить наличие реквизитаКредитныйЛимит.
3. Подключить обработчик загрузки.
4. Найти вAdditionalInfoсвойствоMyCompany.КредитныйЛимит.
5. Преобразовать значение в число.
6. Записать его в объектКонтрагенты.
7. Выполнить загрузку.
8. Проверить значение реквизита в карточке контрагента.## 13. Тестовый сценарий
Проверять лучше на отдельном контрагенте.
### Тест 1. Положительное значение
В базе-источнике установить:
1С (Код)1КредитныйЛимит = 500000,25После обмена в приемнике должно быть:
1С (Код)1КредитныйЛимит = 500000,25### Тест 2. Нулевое значение
В источнике установить:
1С (Код)1КредитныйЛимит = 0После обмена в приемнике должен быть именно ноль.
### Тест 3. Изменение только лимита
Изменить только
КредитныйЛимит, не меняя наименование и ИНН.Проверить, что:
— контрагент зарегистрирован к обмену;
— сформирован пакет;
— значение передано;
— в приемнике лимит изменился.### Тест 4. Старый пакет без свойства
Загрузить пакет, сформированный до доработки.
В этом случае:
— ошибка возникать не должна;
— существующее значение в приемнике желательно не изменять.### Тест 5. Две стороны
Если обмен двусторонний, необходимо отдельно проверить:
— источник изменил лимит и передал приемнику;
— приемник изменил лимит и передал источнику;
— нет циклического затирания значения;
— при конфликте изменений используется предусмотренное типовое правило разрешения конфликтов.## 14. Важное ограничение
Расширение должно быть установлено в обеих базах. Если расширение будет только в базе-источнике, значение попадет в пакет, но база-приемник может его проигнорировать. Если расширение будет только в приемнике, оно сможет загрузить значение только в том случае, если источник уже его передает.
Для надежной работы должны совпадать:
— имя дополнительного свойства;
— формат значения;
— правила обработки пустых значений;
— версия расширения;
— логика выгрузки и загрузки.Практически для задачи с одним реквизитом решение следует строить так:
1С (Код)12345Контрагенты.КредитныйЛимит↓Дополнительная информация EnterpriseData↓Контрагенты.КредитныйЛимитПри этом основная конфигурация не изменяется, КД3.1 не используется, а вся логика располагается в расширении конфигурации и подключается к менеджеру обмена через точки расширения.
-
АвторЗаписи