Ответы в темах
-
АвторЗаписи
-
27 августа 2026 в 10:40 в ответ на: Как устранить ошибку «Номенклатура комплекта и комплектующей в разных группах» в #38489
Ошибка «Номенклатура комплекта и комплектующей находятся в разных группах» при сборке/разборке в 1С возникает, когда позиции номенклатуры, участвующие в операции, принадлежат к разным группам номенклатуры, а в настройках конфигурации или в логике обработки это запрещено.
В типовых конфигурациях (например, УТ, КА, ERP) при работе с комплектами и комплектующими обычно требуется, чтобы комплект и его комплектующие были в одной группе или в согласованных группах, иначе система не позволяет проводить операцию.
—
Как исправить:
1. Проверьте группы номенклатуры комплекта и комплектующих
— Откройте справочник Номенклатура.
— Найдите комплект (готовый товар).
— Посмотрите, в какую группу он входит.
— Аналогично проверьте комплектующие позиции.
— Если группы разные, попробуйте привести их к одной группе или к согласованным группам.2. Настройте группы номенклатуры
— Если у вас есть отдельные группы для комплектов и комплектующих, убедитесь, что в настройках конфигурации разрешена работа с такими группами.
— В некоторых конфигурациях есть настройка, разрешающая сборку/разборку между разными группами.3. Используйте один вид номенклатуры для комплекта и комплектующих
— Обычно комплект и комплектующие имеют тип «Товар».
— Если комплект сделан типом «Комплект» или другим, попробуйте привести к типу «Товар».4. Проверьте варианты комплектации
— В карточке комплекта в разделе «Варианты комплектации» убедитесь, что все комплектующие корректно добавлены и принадлежат к допустимым группам.
5. Если ошибка возникает в документе «Сборка (разборка) товаров»
— Проверьте табличную часть документа.
— Убедитесь, что комплект и комплектующие из одной группы.
— Если нет — исправьте номенклатуру или создайте отдельный комплект с комплектующими из нужной группы.—
Если нужно быстро проверить группы номенклатуры в запросе:
1С (Код)12345678|ВЫБРАТЬ| Номенклатура.Ссылка КАК Номенклатура,| Номенклатура.Наименование,| Номенклатура.Родитель КАК Группа|ИЗ| Справочник.Номенклатура КАК Номенклатура|ГДЕ| Номенклатура.Ссылка В (&СписокНоменклатуры)Подставьте список комплектующих и комплекта, чтобы увидеть группы.
—
Если в вашей конфигурации есть расширение или доработка, которая ограничивает группы, проверьте логику проверки.
—
Если нужна конкретика — приложите скриншот или код документа сборки, где возникает ошибка.
27 августа 2026 в 10:33 в ответ на: Как в 1С активировать строку после сканирования штрихкода в расширении? #38487В 1С Бухгалтерии (например, редакция 3.0) для расширения, чтобы при сканировании штрихкода автоматически активировать (выделить и начать редактирование) добавленную строку в табличной части, нужно:
1. Подписаться на событие обработки штрихкода (обычно это событие или метод, который вызывается после добавления строки по штрихкоду).
2. В обработчике получить ссылку на добавленную строку.
3. Через элемент формы табличной части установить текущую строку и запустить редактирование.
4. Чтобы корректно сработало, вызов установки фокуса и редактирования нужно делать через
ОтложитьВыполнение.Пример кода в расширении (в модуле формы документа, клиент):
1С (Код)1234567891011121314151617181920212223242526272829&НаКлиентеПроцедура ПослеОбработкиШтрихкода(РезультатОбработки)Если РезультатОбработки.ДобавленныеСтроки = Неопределено Или РезультатОбработки.ДобавленныеСтроки.Количество() = 0 ТогдаВозврат;КонецЕсли;// Получаем последнюю добавленную строкуПоследняяСтрока = РезультатОбработки.ДобавленныеСтроки[РезультатОбработки.ДобавленныеСтроки.Количество() - 1];// Находим индекс строки в табличной части по идентификаторуИндексСтроки = Элементы.Товары.Объект.НайтиПоИдентификатору(ПоследняяСтрока);Если ИндексСтроки = Неопределено ТогдаВозврат;КонецЕсли;// Отложенное выполнение, чтобы форма успела обновитьсяОтложитьВыполнение(Новый ОписаниеПроцедуры(Процедура()Элементы.Товары.УстановитьФокус();Элементы.Товары.ТекущаяСтрока = ИндексСтроки;Элементы.Товары.РедактироватьЯчейку(ИндексСтроки, 0); // 0 - номер колонки для редактирования, замените на нужныйКонецПроцедуры));КонецПроцедурыГде:
—
Элементы.Товары— элемент табличной части, замените на имя вашей табличной части.—
РезультатОбработки— структура с результатом сканирования, в которой естьДобавленныеСтроки— массив идентификаторов добавленных строк.—
НайтиПоИдентификатору— метод табличной части, который возвращает индекс строки по идентификатору.—
Как подключить:
— В расширении подпишитесь на событие или переопределите метод, который вызывается после сканирования штрихкода (зависит от конфигурации).
— Вызовите эту процедуру с параметром результата.
—
Если в вашей конфигурации нет готового события, можно в расширении переопределить метод обработки штрихкода, например:
1С (Код)12345678910&НаКлиентеПроцедура ОбработкаШтрихкода(Штрихкод)// Вызов базовой обработкиРезультат = ЭтотОбъект.ОбработкаШтрихкода(Штрихкод);// Вызов процедуры активации строкиПослеОбработкиШтрихкода(Результат);Возврат Результат;КонецПроцедуры—
Если нужна помощь с конкретным местом подключения или кодом — приложите фрагмент, где происходит обработка штрихкода.
26 августа 2026 в 16:30 в ответ на: Какие типы данных допустимы при записи структуры в JSON в 1С? #38485Ошибка «Значение содержит данные недопустимых типов» при вызове
ЗаписатьJSONвозникает, когда в структуре или массиве есть значения, которые платформа 1С не может сериализовать в JSON.Допустимые типы для сериализации в JSON через
ЗаписатьJSON:— Примитивы: Строка, Число, Булево, Дата, Неопределено (будет null)
— Структура (ключи — строки, значения — допустимые типы)
— Массив (элементы — допустимые типы)
— ТаблицаЗначений (будет сериализована как массив структур)
— Ссылки на объекты 1С — нельзя напрямую, нужно преобразовать в строку или структуру
— Не поддерживаются: объекты, COM-объекты, сложные типы, например, реквизиты с типом «Объект», «Документ», «Справочник» и т.п.—
В вашем коде вероятно проблема в том, что в структуре есть поля, которые являются ссылками на объекты 1С (например,
СсылкаНаДокумент,Организация,Контрагент,Договор,Склади т.п.). Вы их просто приводите к строке черезСтрока(), но это не всегда корректно, особенно если это не строка, а объект.Рекомендации:
1. Для ссылок на объекты 1С используйте метод
.Представление()или.Ссылкас последующим преобразованием в строку, например:1С (Код)1ПолучениеДанныхИзДокумента.Вставить("ДокументРеализации", СсылкаНаДокумент.Представление());или
1С (Код)1ПолучениеДанныхИзДокумента.Вставить("ДокументРеализации", Строка(СсылкаНаДокумент));но лучше проверить, что именно возвращает
Строка(СсылкаНаДокумент)— иногда это не то, что ожидается.2. В табличной части тоже проверьте, что все поля — это простые типы (строки, числа, даты). Если там есть ссылки, то их тоже нужно преобразовать в строку или структуру с нужными полями.
Например:
1С (Код)1СтруктураСтроки.Вставить("Номенклатура", СтрТаблицы.Номенклатура.Представление());3. Если есть даты, они сериализуются нормально, но если есть неопределенные значения — лучше заменить на
Неопределеноили"".4. Если есть булевы — они сериализуются нормально.
—
Пример исправления для ссылок:
1С (Код)1234ПолучениеДанныхИзДокумента.Вставить("ДокументРеализации", СсылкаНаДокумент.Представление());ПолучениеДанныхИзДокумента.Вставить("ПолеОрганизация", Организация.Представление());ПолучениеДанныхИзДокумента.Вставить("ПолеОргИНН", Строка(ОрганизацияИНН));...В табличной части:
1С (Код)12СтруктураСтроки.Вставить("Номенклатура", СтрТаблицы.Номенклатура.Представление());СтруктураСтроки.Вставить("Склад", СтрТаблицы.Склад.Представление());Если
Представление()не подходит, можно взять нужные реквизиты из объекта и сформировать структуру.—
Проверка типов перед сериализацией:
Можно написать функцию, которая рекурсивно обходит структуру/массив и преобразует все ссылки в строки:
1С (Код)123456789101112131415161718192021222324252627282930Функция ПреобразоватьДляJSON(Знач)Если ТипЗнч(Знач) = Тип("Структура") ТогдаРезультат = Новый Структура;Для каждого Элемент Из Знач ЦиклРезультат.Вставить(Элемент.Ключ, ПреобразоватьДляJSON(Элемент.Значение));КонецЦикла;Возврат Результат;ИначеЕсли ТипЗнч(Знач) = Тип("Массив") ТогдаРезультат = Новый Массив;Для каждого Элемент Из Знач ЦиклРезультат.Добавить(ПреобразоватьДляJSON(Элемент));КонецЦикла;Возврат Результат;ИначеЕсли ТипЗнч(Знач) = Тип("Ссылка") ТогдаВозврат Знач.Представление();ИначеЕсли ТипЗнч(Знач) = Тип("Дата") ТогдаВозврат Знач;ИначеЕсли ТипЗнч(Знач) = Тип("Булево") ТогдаВозврат Знач;ИначеЕсли ТипЗнч(Знач) = Тип("Число") ТогдаВозврат Знач;ИначеЕсли ТипЗнч(Знач) = Тип("Строка") ТогдаВозврат Знач;ИначеЕсли Знач = Неопределено ТогдаВозврат Неопределено;Иначе// Прочие типы преобразовать в строкуВозврат Строка(Знач);КонецЕсли;КонецФункцииИ перед сериализацией делать:
1С (Код)12ДанныеДляJSON = ПреобразоватьДляJSON(ПолучениеДанныхИзДокумента);ЗаписатьJSON(ЗаписьJSON, ДанныеДляJSON);—
Итог:
— В структуре и массивах должны быть только простые типы: строки, числа, даты, булевы, структуры, массивы.
— Ссылки на объекты 1С нужно преобразовывать в строки или структуры с нужными полями.
— Не должно быть объектов, COM-объектов, сложных типов.—
Рекомендую посмотреть подробный разбор здесь:
https://helpf.pro/faq/view/1664.html
там есть примеры работы с JSON и преобразования типов.26 августа 2026 в 16:15 в ответ на: Как правильно сериализовать структуру в JSON в 1С без СериализаторXDTO? #38483Ваша ошибка связана с тем, что объекты
ЗаписьСтрокииСериализаторXDTOотсутствуют в вашей версии платформы 1С (толстый клиент, обычное приложение). Эти объекты появились в более новых версиях платформы (8.3.7+).Для решения задачи сериализации структуры в JSON с выбором файла в более старых версиях 1С (до 8.3.7) используйте стандартные методы
ПрочитатьJSON()иЗаписатьJSON()из глобального контекста, либо реализуйте сериализацию вручную.Вот рабочий пример для версии 8.3.6 и ниже, без использования
СериализаторXDTO:1С (Код)123456789101112131415161718192021222324252627282930313233343536373839Процедура Кнопка2Нажатие(Элемент)// Формируем структуру с даннымиПолучениеДанныхИзДокумента = Новый Структура;ПолучениеДанныхИзДокумента.Вставить("ДокументРеализации", Строка(СсылкаНаДокумент));// ... вставьте остальные поля как у вас ...МассивТаблицы = Новый Массив;Для каждого СтрТаблицы Из ТабличнаяЧасть ЦиклСтруктураСтроки = Новый Структура;СтруктураСтроки.Вставить("Артикул", СтрТаблицы.Артикул);// ... остальные поля ...МассивТаблицы.Добавить(СтруктураСтроки);КонецЦикла;ПолучениеДанныхИзДокумента.Вставить("Массив", МассивТаблицы);// Диалог выбора файлаДиалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);Диалог.Фильтр = "Файлы JSON (*.json)|*.json";Если НЕ Диалог.Выбрать() ТогдаВозврат;КонецЕсли;Путь = Диалог.ПолноеИмяФайла;// Сериализация и запись в файлЗаписатьJSONВФайл(ПолучениеДанныхИзДокумента, Путь);КонецПроцедурыПроцедура ЗаписатьJSONВФайл(Данные, Путь)// Создаем объект записи JSONЗаписьJSON = Новый ЗаписьJSON;ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(, Символы.Таб);ЗаписьJSON.ОткрытьФайл(Путь, , , ПараметрыЗаписи);// Записываем структуру в JSONЗаписатьJSON(ЗаписьJSON, Данные);// Закрываем поток записиЗаписьJSON.Закрыть();КонецПроцедурыОбъяснения:
—
ЗаписьJSONиПараметрыЗаписиJSON— стандартные объекты платформы 1С для записи JSON.
—ЗаписатьJSON(ЗаписьJSON, Данные)— глобальная процедура, которая сериализует структуру/массив в JSON.
—ЗаписьJSON.ОткрытьФайлоткрывает файл для записи.
—ЗаписьJSON.Закрыть()закрывает файл.Такой код работает в версиях 8.3.6 и ниже, где нет
СериализаторXDTO.Если у вас версия платформы ниже 8.3.6, то придется использовать сторонние библиотеки или писать собственную сериализацию.
—
Если хотите проверить версию платформы, используйте:
1С (Код)1Сообщить(ВерсияПлатформы());—
Рекомендации:
— Используйте
ЗаписатьJSONиЧитатьJSONиз стандартных средств платформы.
— Не используйтеСериализаторXDTOв старых версиях.
— Для чтения/записи JSON в файл используйтеЗаписьJSONиЧтениеJSON.—
Рекомендую посмотреть здесь — пример работы с JSON в 1С:
https://helpf.pro/faq/view/1664.html
https://infostart.ru/public/1043459/26 августа 2026 в 13:00 в ответ на: Как добавить поле Регистратор в запрос на остатки и обороты? #38481Чтобы добавить измерение Регистратор в ваш запрос, нужно:
1. Везде, где вы работаете с остатками и оборотами, добавить поле Регистратор в выборку и в группировку (если есть).
2. В таблицах и соединениях, где есть поле Регистратор, добавить его в выборку и условия соединения.
3. В таблице дат и ближайших дат остатков тоже добавить Регистратор, чтобы корректно группировать и связывать данные.Пример, как добавить Регистратор в ваш запрос (только ключевые места):
—
### 1. В выборке из регистра накопления остатков и оборотов:
|ВЫБРАТЬ
| ТоварыНаСкладахОстаткиИОбороты.Период,
| ТоварыНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
| ТоварыНаСкладахОстаткиИОбороты.Регистратор,
| ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
|ПОМЕСТИТЬ ВТ_Остатки
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(, , День, Движения, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОстаткиИОбороты—
### 2. В таблице ближайших дат остатков добавить Регистратор в выборку и группировку:
|ВЫБРАТЬ
| ТаблицаДат.Период КАК ТДПериод,
| МАКСИМУМ(ВТ_Остатки.Период) КАК ПериодРО,
| ВТ_Остатки.Номенклатура,
| ВТ_Остатки.Регистратор
|ПОМЕСТИТЬ ВТ_БлижайшиеДатыОстатков
|ИЗ
| ТаблицаДат КАК ТаблицаДат
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
| ПО ТаблицаДат.Период >= ВТ_Остатки.Период
|СГРУППИРОВАТЬ ПО
| ТаблицаДат.Период,
| ВТ_Остатки.Номенклатура,
| ВТ_Остатки.Регистратор—
### 3. В основном запросе добавить Регистратор в выборку и условия соединения:
|ВЫБРАТЬ
| ВТ_БлижайшиеДатыОстатков.ТДПериод КАК ТДПериод,
| ВТ_Остатки.Номенклатура,
| ВТ_Остатки.Регистратор,
| ВЫБОР
| КОГДА ТДПериод = ВТ_Остатки.Период
| ТОГДА ВТ_Остатки.КоличествоНачальныйОстаток
| ИНАЧЕ ВТ_Остатки.КоличествоКонечныйОстаток
| КОНЕЦ КАК КоличествоНачальныйОстаток,
| ВЫБОР
| КОГДА ТДПериод = ВТ_Остатки.Период
| ТОГДА ВТ_Остатки.КоличествоПриход
| ИНАЧЕ 0
| КОНЕЦ КАК КоличествоПриход,
| ВЫБОР
| КОГДА ТДПериод = ВТ_Остатки.Период
| ТОГДА ВТ_Остатки.КоличествоРасход
| ИНАЧЕ 0
| КОНЕЦ КАК КоличествоРасход,
| ВТ_Остатки.КоличествоКонечныйОстаток,
| ТоварыНаСкладахОбороты.Регистратор
|ИЗ
| ВТ_БлижайшиеДатыОстатков КАК ВТ_БлижайшиеДатыОстатков
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
| ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
| И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.Номенклатура
| И ВТ_БлижайшиеДатыОстатков.Регистратор = ВТ_Остатки.Регистратор
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОбороты
| ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)
| И ВТ_Остатки.Регистратор = ТоварыНаСкладахОбороты.Регистратор
|УПОРЯДОЧИТЬ ПО
| ТДПериод—
### Кратко:
— Добавьте поле Регистратор в выборки из регистра остатков и оборотов.
— Добавьте Регистратор в таблицу ближайших дат и группировку.
— В условиях соединения добавьте сравнение по Регистратору.
— В итоговой выборке добавьте Регистратор.—
Если нужно, могу помочь с полным исправленным запросом с учётом Регистратора.
26 августа 2026 в 12:55 в ответ на: Какие ошибки в запросе 1С могут вызывать неправильные остатки товаров? #38479В вашем запросе есть несколько ошибок синтаксиса и логики, которые мешают корректному выполнению:
1. Дублирование соединений (ПО) подряд
В блоке с соединениями:|ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(…) КАК ТоварыНаСкладахОбороты
|ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)
|ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
|И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.НоменклатураЗдесь два оператора ПО подряд — это ошибка. В 1С запросах после каждого соединения должен быть только один оператор ПО.
Правильно:
|ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
|ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
|И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.Номенклатура
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОбороты
|ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)2. Отсутствие запятых между полями в выборке
В блоке выбора полей:|ВЫБОР … КОНЕЦ КАК КоличествоРасход,
|ВТ_Остатки.КоличествоКонечныйОстаток
|ТоварыНаСкладахОбороты.РегистраторМежду
КоличествоКонечныйОстатокиТоварыНаСкладахОбороты.Регистраторотсутствует запятая.Добавьте запятую:
|ВЫБОР … КОНЕЦ КАК КоличествоРасход,
|ВТ_Остатки.КоличествоКонечныйОстаток,
|ТоварыНаСкладахОбороты.Регистратор3. Дублирование соединений с ВТ_Остатки и ТоварыНаСкладахОбороты
В запросе дважды повторяются соединения с ВТ_Остатки и ТоварыНаСкладахОбороты, что избыточно и вызовет ошибку.Удалите повторяющиеся соединения, оставьте по одному соединению каждого.
4. Рекомендация по построению таблицы дат
Ваш способ построения таблицы дат через разряды — классический и рабочий. Убедитесь, что параметры&ДатаНачалаи&ДатаОкончаниякорректны.—
### Итог: исправленный фрагмент с соединениями и выборкой
|ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
|ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
|И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.Номенклатура
|ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОбороты
|ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)—
|ВЫБРАТЬ
| ВТ_БлижайшиеДатыОстатков.ТДПериод КАК ТДПериод,
| ВТ_Остатки.Номенклатура,
| ВЫБОР
| КОГДА ТДПериод = ВТ_Остатки.Период
| ТОГДА ВТ_Остатки.КоличествоНачальныйОстаток
| ИНАЧЕ ВТ_Остатки.КоличествоКонечныйОстаток
| КОНЕЦ КАК КоличествоНачальныйОстаток,
| ВЫБОР
| КОГДА ТДПериод = ВТ_Остатки.Период
| ТОГДА ВТ_Остатки.КоличествоПриход
| ИНАЧЕ 0
| КОНЕЦ КАК КоличествоПриход,
| ВЫБОР
| КОГДА ТДПериод = ВТ_Остатки.Период
| ТОГДА ВТ_Остатки.КоличествоРасход
| ИНАЧЕ 0
| КОНЕЦ КАК КоличествоРасход,
| ВТ_Остатки.КоличествоКонечныйОстаток,
| ТоварыНаСкладахОбороты.Регистратор
|ИЗ
| ВТ_БлижайшиеДатыОстатков КАК ВТ_БлижайшиеДатыОстатков
| ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
| ПО ВТ_БлижайшиеДатыОстатков.ПериодРО = ВТ_Остатки.Период
| И ВТ_БлижайшиеДатыОстатков.Номенклатура = ВТ_Остатки.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Номенклатура = &Номенклатура) КАК ТоварыНаСкладахОбороты
| ПО ВТ_Остатки.Период = НАЧАЛОПЕРИОДА(ТоварыНаСкладахОбороты.Период, ДЕНЬ)
|УПОРЯДОЧИТЬ ПО
| ТДПериод—
Если нужно, могу помочь с полным исправленным текстом запроса.
26 августа 2026 в 11:20 в ответ на: Как исправить ошибки синтаксиса в 1С при использовании анонимных процедур? #38477Ошибка «Ожидается выражение» и «Ожидается ключевое слово ‘КонецЕсли'» указывает на синтаксическую ошибку в коде, чаще всего из-за неправильного использования
Новый ОписаниеПроцедуры.В 1С
Новый ОписаниеПроцедурытребует в качестве параметра имя процедуры или анонимную процедуру, но анонимные процедуры в 1С пишутся так:1С (Код)123Новый ОписаниеПроцедуры(Процедура()// тело процедурыКонецПроцедуры)Обратите внимание, что
Процедура()иКонецПроцедурыдолжны быть внутри скобокНовый ОписаниеПроцедуры(...).В вашем коде, скорее всего, пропущена скобка или неверно оформлен блок.
Правильный пример с отложенным выполнением:
1С (Код)123456789ОтложитьВыполнение(Новый ОписаниеПроцедуры(Процедура()Элементы.Товары.УстановитьФокус();Элементы.Товары.ТекущаяСтрока = ИндексСтроки;Элементы.Товары.РедактироватьЯчейку(ИндексСтроки, 0);КонецПроцедуры));Если у вас ошибка, значит, в вашем коде где-то:
— Лишний или отсутствующий символ
(или)
— Неправильное расположениеПроцедура()иКонецПроцедуры
— Возможно, вы вставили код в модуль, где нельзя использовать анонимные процедуры (например, в серверном модуле)—
Проверьте, что:
1. Процедура с
ОтложитьВыполнениенаходится в клиентском модуле (форма, общий модуль с пометкой &НаКлиенте).2. Код выглядит именно так (пример):
1С (Код)123456789101112131415161718192021222324252627282930313233343536&НаКлиентеПроцедура VDP_Подключаемый_ПослеОбработкиШтрихкодов(РезультатОбработкиШтрихкода, ДополнительныеПараметры) ЭкспортЕсли РезультатОбработкиШтрихкода.ТребуетсяОбработкаШтрихкода Тогда// Вызов основной обработкиШтрихкодированиеИСКлиентПереопределяемый.ПослеОбработкиШтрихкодов(ЭтотОбъект,ДанныеДляОбработки,КэшированныеЗначения);Если РезультатОбработкиШтрихкода.ДобавленныеСтроки <> Неопределено И РезультатОбработкиШтрихкода.ДобавленныеСтроки.Количество() > 0 ТогдаПоследняяСтрока = РезультатОбработкиШтрихкода.ДобавленныеСтроки[РезультатОбработкиШтрихкода.ДобавленныеСтроки.Количество() - 1];ИндексСтроки = Элементы.Товары.Объект.НайтиПоИдентификатору(ПоследняяСтрока);Если ИндексСтроки <> Неопределено ТогдаОтложитьВыполнение(Новый ОписаниеПроцедуры(Процедура()Элементы.Товары.УстановитьФокус();Элементы.Товары.ТекущаяСтрока = ИндексСтроки;Элементы.Товары.РедактироватьЯчейку(ИндексСтроки, 0);КонецПроцедуры));КонецЕсли;КонецЕсли;КонецЕсли;КонецПроцедуры3. Если ошибка сохраняется, попробуйте временно заменить
ОтложитьВыполнениена простой вызов, чтобы проверить синтаксис:1С (Код)123Элементы.Товары.УстановитьФокус();Элементы.Товары.ТекущаяСтрока = ИндексСтроки;Элементы.Товары.РедактироватьЯчейку(ИндексСтроки, 0);Если с этим всё нормально, значит проблема именно в оформлении
Новый ОписаниеПроцедуры.—
Если хотите, могу проверить ваш конкретный код — пришлите точный фрагмент с
ОтложитьВыполнение.26 августа 2026 в 11:10 в ответ на: Как после добавления строк в табличную часть включить редактирование ячейки? #38475Вот полный пример процедуры с отложенным выполнением, которая после добавления строк в табличную часть устанавливает текущую строку, фокус и начинает редактирование ячейки:
1С (Код)1234567891011121314151617181920212223242526272829303132333435363738&НаКлиенте&ИзменениеИКонтроль("Подключаемый_ПослеОбработкиШтрихкодов")Процедура VDP_Подключаемый_ПослеОбработкиШтрихкодов(РезультатОбработкиШтрихкода, ДополнительныеПараметры) ЭкспортЕсли РезультатОбработкиШтрихкода.ТребуетсяОбработкаШтрихкода Тогда// Вызов основной обработкиШтрихкодированиеИСКлиентПереопределяемый.ПослеОбработкиШтрихкодов(ЭтотОбъект,ДанныеДляОбработки,КэшированныеЗначения);// Проверяем, есть ли добавленные строкиЕсли РезультатОбработкиШтрихкода.ДобавленныеСтроки <> Неопределено И РезультатОбработкиШтрихкода.ДобавленныеСтроки.Количество() > 0 ТогдаПоследняяСтрока = РезультатОбработкиШтрихкода.ДобавленныеСтроки[РезультатОбработкиШтрихкода.ДобавленныеСтроки.Количество() - 1];ИндексСтроки = Элементы.Товары.Объект.НайтиПоИдентификатору(ПоследняяСтрока);Если ИндексСтроки <> Неопределено ТогдаОтложитьВыполнение(Новый ОписаниеПроцедуры(Процедура()Элементы.Товары.УстановитьФокус();Элементы.Товары.ТекущаяСтрока = ИндексСтроки;Элементы.Товары.РедактироватьЯчейку(ИндексСтроки, 0);КонецПроцедуры));КонецЕсли;КонецЕсли;КонецЕсли;КонецПроцедурыОбъяснение:
—
ОтложитьВыполнениеоткладывает выполнение вложенной процедуры на следующий цикл обработки событий, что позволяет форме обновить табличную часть и отобразить новые строки.
— Внутри отложенной процедуры сначала устанавливается фокус на табличную часть, затем выбирается нужная строка и запускается редактирование ячейки.
— Убедитесь, что имя табличной части —"Товары". Если другое, замените в коде.Такой подход решает проблему с тем, что фокус и редактирование не срабатывают сразу после добавления строк.
Проблема с тем, что не активируется вновь добавленная строка, часто связана с тем, что обновление табличной части и установка фокуса происходят слишком рано — до того, как форма успевает обновить данные и отобразить новую строку.
В вашем коде:
1С (Код)1234567ИндексСтроки = Элементы.Товары.Объект.НайтиПоИдентификатору(ПоследняяСтрока);Если ИндексСтроки <> Неопределено ТогдаЭлементы.Товары.ТекущаяСтрока = ИндексСтроки;Элементы.Товары.УстановитьФокус();Элементы.Товары.РедактироватьЯчейку(ИндексСтроки, 0);КонецЕсли;Что сделать, чтобы заработало:
1. Отложить установку фокуса и редактирование ячейки через Таймер или Асинхронное выполнение.
Например, обернуть код в
ОтложитьВыполнение:1С (Код)1234567891011Если ИндексСтроки <> Неопределено ТогдаОтложитьВыполнение(Новый ОписаниеПроцедуры(Процедура()Элементы.Товары.ТекущаяСтрока = ИндексСтроки;Элементы.Товары.УстановитьФокус();Элементы.Товары.РедактироватьЯчейку(ИндексСтроки, 0);КонецПроцедуры));КонецЕсли;2. Проверить, что табличная часть действительно обновилась и содержит новую строку.
Если вы добавляете строки программно, убедитесь, что данные в табличной части обновлены и форма их отобразила.
3. Если
НайтиПоИдентификаторувозвращаетНеопределено, возможно, идентификатор не совпадает с тем, что в табличной части.Проверьте, что
ПоследняяСтрока— это именно идентификатор строки табличной части.4. Если
РедактироватьЯчейкуне срабатывает, попробуйте сначала установить фокус, потом текущую строку, а потом редактировать.Иногда порядок важен:
1С (Код)123456789ОтложитьВыполнение(Новый ОписаниеПроцедуры(Процедура()Элементы.Товары.УстановитьФокус();Элементы.Товары.ТекущаяСтрока = ИндексСтроки;Элементы.Товары.РедактироватьЯчейку(ИндексСтроки, 0);КонецПроцедуры));—
Итог:
ИспользуйтеОтложитьВыполнениедля установки текущей строки и фокуса, чтобы дать время форме обновиться после добавления строки.—
Если нужно, могу помочь с примером полного кода с отложенным выполнением.
26 августа 2026 в 11:05 в ответ на: Как исправить ошибку «Переменная не определена (ЭлементыФормы)» в 1С? #38471Ошибка «Переменная не определена (ЭлементыФормы)» говорит о том, что в модуле формы вы пытаетесь обратиться к переменной
ЭлементыФормы, которой в контексте нет.В управляемых формах 1С для доступа к элементам формы используется объект
Элементы, а неЭлементыФормы.Правильно будет использовать:
1С (Код)123456ИндексСтроки = Элементы.Товары.Объект.НайтиПоИдентификатору(ПоследняяСтрока);Если ИндексСтроки <> Неопределено ТогдаЭлементы.Товары.ТекущаяСтрока = ИндексСтроки;Элементы.Товары.УстановитьФокус();Элементы.Товары.РедактироватьЯчейку(ИндексСтроки, 0);КонецЕсли;—
Что нужно сделать:
1. Заменить все
ЭлементыФормынаЭлементыв коде модуля формы.2. Убедиться, что имя табличного поля действительно
"Товары". Если другое — заменить на актуальное.—
Пример исправленного кода:
1С (Код)12345678910111213Если РезультатОбработкиШтрихкода.ДобавленныеСтроки <> Неопределено И РезультатОбработкиШтрихкода.ДобавленныеСтроки.Количество() > 0 ТогдаПоследняяСтрока = РезультатОбработкиШтрихкода.ДобавленныеСтроки[РезультатОбработкиШтрихкода.ДобавленныеСтроки.Количество() - 1];ИндексСтроки = Элементы.Товары.Объект.НайтиПоИдентификатору(ПоследняяСтрока);Если ИндексСтроки <> Неопределено ТогдаЭлементы.Товары.ТекущаяСтрока = ИндексСтроки;Элементы.Товары.УстановитьФокус();Элементы.Товары.РедактироватьЯчейку(ИндексСтроки, 0);КонецЕсли;КонецЕсли;—
Если вы используете обычную форму, то там доступ к элементам формы через
ЭлементыФормы, но в управляемой форме — черезЭлементы.—
Рекомендую также проверить, что код находится именно в модуле формы (не в общем модуле), и что вызывается в контексте формы, где доступен объект
Элементы.26 августа 2026 в 10:51 в ответ на: Как выгрузить склад из подразделения в РКО в КД 2 при выгрузке? #38469В КД 2 (Комплексная автоматизация 2) в документе РКО (Расходный кассовый ордер) по умолчанию склад не указывается, а есть только подразделение. Чтобы при выгрузке РКО получить склад, связанный с этим подразделением, нужно сделать следующее:
1. Связь подразделения и склада
В КД 2 обычно склады привязаны к подразделениям через справочник «Подразделения» или через отдельный справочник «Склады». Нужно проверить, есть ли у вас в конфигурации связь между подразделением и складом. Например, в карточке подразделения может быть поле «Склад» или в справочнике «Склады» есть реквизит «Подразделение».2. Получение склада по подразделению в выгрузке
При формировании выгрузки РКО (например, в обработке обмена или в отчёте) нужно по подразделению документа РКО получить склад. Пример кода на 1С:1С (Код)12345678910111213141516171819202122232425// Получаем подразделение из РКОПодразделение = ДокументРКО.Подразделение;// Получаем склад по подразделению// Вариант 1: если в справочнике Подразделения есть реквизит СкладЕсли ЗначениеЗаполнено(Подразделение.Склад) ТогдаСклад = Подразделение.Склад;Иначе// Вариант 2: ищем склад по подразделению в справочнике СкладыЗапрос = Новый Запрос;Запрос.Текст =|ВЫБРАТЬ| Склады.Ссылка|ИЗ| Справочник.Склады КАК Склады|ГДЕ| Склады.Подразделение = &Подразделение";Запрос.УстановитьПараметр("Подразделение", Подразделение);Результат = Запрос.Выполнить().Выбрать();Если Результат.Следующий() ТогдаСклад = Результат.Ссылка;КонецЕсли;КонецЕсли;// Теперь используйте переменную Склад для выгрузки3. Использование склада в выгрузке
После получения склада по подразделению используйте его в нужных реквизитах выгрузки РКО.—
Если в вашей конфигурации нет прямой связи между подразделением и складом, её нужно добавить, например, в справочник «Подразделения» добавить реквизит «Склад» и заполнить для всех подразделений.
—
Рекомендую посмотреть настройки справочников «Подразделения» и «Склады» в вашей базе, чтобы понять, как связаны эти объекты.
—
Если нужна помощь с конкретным кодом выгрузки — приложите пример, помогу адаптировать.
26 августа 2026 в 10:47 в ответ на: Как установить курсор на новую строку после обработки штрихкодов? #38467В вашем клиентском методе
Подключаемый_ПослеОбработкиШтрихкодовнужно после вызоваШтрихкодированиеИСКлиентПереопределяемый.ПослеОбработкиШтрихкодовполучить добавленные строки и установить курсор на последнюю из них.Для этого нужно:
1. Получить массив добавленных строк из
РезультатОбработкиШтрихкода.
2. Найти индекс этой строки в табличной части формы.
3. Установить текущую строку и фокус на табличное поле.Пример доработки вашего метода:
1С (Код)123456789101112131415161718192021222324252627&НаКлиентеПроцедура Подключаемый_ПослеОбработкиШтрихкодов(РезультатОбработкиШтрихкода, ДополнительныеПараметры) ЭкспортЕсли РезультатОбработкиШтрихкода.ТребуетсяОбработкаШтрихкода Тогда// Вызов основной обработкиШтрихкодированиеИСКлиентПереопределяемый.ПослеОбработкиШтрихкодов(ЭтотОбъект,ДанныеДляОбработки,КэшированныеЗначения);// Проверяем, есть ли добавленные строкиЕсли РезультатОбработкиШтрихкода.ДобавленныеСтроки <> Неопределено И РезультатОбработкиШтрихкода.ДобавленныеСтроки.Количество() > 0 ТогдаПоследняяСтрока = РезультатОбработкиШтрихкода.ДобавленныеСтроки[РезультатОбработкиШтрихкода.ДобавленныеСтроки.Количество() - 1];// Предполагается, что табличное поле называется "Товары"ИндексСтроки = ЭлементыФормы.Товары.Объект.НайтиПоИдентификатору(ПоследняяСтрока);Если ИндексСтроки <> Неопределено ТогдаЭлементыФормы.Товары.ТекущаяСтрока = ИндексСтроки;ЭлементыФормы.Товары.УстановитьФокус();ЭлементыФормы.Товары.РедактироватьЯчейку(ИндексСтроки, 0);КонецЕсли;КонецЕсли;КонецЕсли;КонецПроцедуры—
Обратите внимание:
—
ЭлементыФормы.Товары— замените на имя вашего табличного поля.
—ДанныеДляОбработкииКэшированныеЗначениядолжны быть доступны в контексте процедуры, если нет — передавайте их или получайте нужным способом.
— ЕслиРезультатОбработкиШтрихкода.ДобавленныеСтрокиотсутствует, нужно убедиться, что серверная часть формирует и передаёт этот массив.—
Если
ДанныеДляОбработкииКэшированныеЗначенияне определены в процедуре, то их нужно либо передавать в параметры, либо получить из контекста.—
Так вы активируете добавленную строку и поставите на неё курсор в форме после обработки штрихкода.
26 августа 2026 в 10:40 в ответ на: Как выбрать между XML и JSON для сохранения структуры в 1С? #38465Проще сохранять структуру с выбором файла в формате JSON.
Почему JSON проще:
1. Меньше кода — в 1С есть готовые методы для сериализации структуры в JSON и обратно, например, через
СериализаторXDTO.ЗаписатьJSON()или простые функции из стандартных библиотек.2. Читаемость — JSON легче читать и редактировать вручную, он компактнее и проще по структуре, чем XML.
3. Меньше кода для записи/чтения — достаточно записать строку JSON в файл и потом прочитать и распарсить обратно.
4. Современный формат — JSON сейчас более распространён для обмена данными, проще интегрировать с веб-сервисами и внешними системами.
Пример сохранения структуры в JSON с выбором файла:
1С (Код)12345678910111213141516Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);Диалог.Фильтр = "Файлы JSON (*.json)|*.json";Если НЕ Диалог.Выбрать() ТогдаВозврат;КонецЕсли;Путь = Диалог.ПолноеИмяФайла;// Сериализация структуры в JSONСтрокаJSON = СериализаторXDTO.ЗаписатьJSON(ПолучениеДанныхИзДокумента);// Запись в файлФайл = Новый Файл(Путь);Поток = Файл.ОткрытьДляЗаписи();Поток.ЗаписатьСтроку(СтрокаJSON);Поток.Закрыть();Для XML придётся писать больше кода вручную, особенно если структура сложная и содержит массивы.
Если нужна простота и скорость — выбирайте JSON.
Рекомендую посмотреть здесь:
https://helpf.pro/faq/view/1299.html
https://infostart.ru/1c/articles/59535/26 августа 2026 в 10:26 в ответ на: Как вызвать серверную процедуру из формы и установить курсор на строку? #38463Вот пример, как из модуля формы вызвать серверную процедуру, получить результат (например, массив добавленных строк), и установить курсор на последнюю добавленную строку в табличном поле.
—
### 1. Серверная процедура (в модуле объекта или общего модуля с директивой &НаСервере)
1С (Код)12345678910111213141516&НаСервереФункция ПослеОбработкиШтрихкодов(Параметры)// Здесь ваша логика обработки штрихкодов, добавления строк в табличную часть// Для примера создадим массив добавленных строк (ссылки на строки табличной части)ДобавленныеСтроки = Новый Массив;// Добавим строку в табличную часть (пример)НоваяСтрока = ЭтотОбъект.Товары.Добавить();НоваяСтрока.Номенклатура = Параметры.Номенклатура;НоваяСтрока.Количество = 1;ДобавленныеСтроки.Добавить(НоваяСтрока);// Возвращаем массив добавленных строкВозврат ДобавленныеСтроки;КонецФункции—
### 2. Клиентский вызов из модуля формы
1С (Код)1234567891011121314151617181920212223&НаКлиентеПроцедура ОбработатьШтрихкод(Номенклатура)// Вызов серверной функции с передачей параметровДобавленныеСтроки = ЭтотОбъект.ПослеОбработкиШтрихкодов(Новый Структура("Номенклатура", Номенклатура));Если ДобавленныеСтроки.Количество() > 0 ТогдаПоследняяСтрока = ДобавленныеСтроки[ДобавленныеСтроки.Количество() - 1];// Находим индекс строки в табличной части по ссылкеИндексСтроки = ЭлементыФормы.Товары.Объект.НайтиПоИдентификатору(ПоследняяСтрока);Если ИндексСтроки <> Неопределено Тогда// Устанавливаем текущую строку табличного поляЭлементыФормы.Товары.ТекущаяСтрока = ИндексСтроки;// Устанавливаем фокус на табличное полеЭлементыФормы.Товары.УстановитьФокус();// Начинаем редактирование первой ячейкиЭлементыФормы.Товары.РедактироватьЯчейку(ИндексСтроки, 0);КонецЕсли;КонецЕсли;КонецПроцедуры—
### Пояснения:
—
ЭтотОбъект— ссылка на текущий объект (документ, справочник и т.п.), в котором есть табличная частьТовары.
— Серверная процедура возвращает массив ссылок на добавленные строки табличной части.
— На клиенте по этим ссылкам ищем индекс строки в табличном поле формы.
— Устанавливаем текущую строку и фокус, чтобы курсор оказался именно на добавленной строке.
— МетодРедактироватьЯчейкузапускает режим редактирования ячейки.—
Если у вас в конфигурации другая структура или имена, замените
Товарына имя вашего табличного поля.—
Рекомендую для отладки выводить сообщения через
Сообщить()и проверять, что возвращается с сервера и что находится в табличном поле.В вашем запросе есть несколько ошибок и неточностей, которые мешают получить корректный результат:
1. В последнем блоке запроса:
|ВЫБРАТЬ
| Дни.Период КАК Период,
| Движения.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| СУММА(Движения.КоличествоОборот) КАК КоличествоОборот,
| Движения.СуммаОборот ПОМЕСТИТЬ ОстаткинаНачалоДня
|ИЗ Дни КАК Дни
| ЛЕВОЕ СОЕДИНЕНИЕ Движения КАК Движения
| ПО (Движения.Период < Дни.Период)
|СГРУППИРОВАТЬ ПО
| Дни.Период,
| Движения.ХарактеристикаНоменклатуры,
| Движения.СуммаОборот— Здесь ошибка в условии соединения: «Движения.Период < Дни.Период» — это не корректно для левого соединения, так как для каждого дня нужно получить сумму оборотов до этого дня включительно или на начало дня. Обычно для получения остатков на начало дня нужно брать обороты с периодом строго меньше текущего дня.
— Но при этом в выборке вы группируете по Движения.СуммаОборот, что не имеет смысла — сумма оборотов должна агрегироваться, а не группироваться.
— Также поле Движения.СуммаОборот не агрегируется, а просто выбирается, что вызовет ошибку.
Правильный вариант последнего блока:
|ВЫБРАТЬ
| Дни.Период КАК Период,
| Движения.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| СУММА(Движения.КоличествоОборот) КАК КоличествоОборот,
| СУММА(Движения.СуммаОборот) КАК СуммаОборот
|ПОМЕСТИТЬ ОстаткинаНачалоДня
|ИЗ Дни КАК Дни
| ЛЕВОЕ СОЕДИНЕНИЕ Движения КАК Движения
| ПО (Движения.Период < Дни.Период)
|СГРУППИРОВАТЬ ПО
| Дни.Период,
| Движения.ХарактеристикаНоменклатуры2. В первом блоке с объединением остатков и оборотов:
— Вы берёте остатки на день, который на 1 день меньше начала периода:
|ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, -1)
Это правильно, чтобы получить начальный остаток на день перед началом периода.
3. В блоке с выборкой дней:
— Вы берёте дни из регистра ДвиженияДенежныхСредств.Обороты, чтобы получить все дни с движениями.
— Если хотите получить остатки на каждый день, даже если движения отсутствуют, нужно дополнительно построить календарь дней (например, через рекурсивный запрос или таблицу дат).
4. В целом, для получения остатков на каждый день, даже если движения отсутствуют, рекомендую использовать метод с календарём дней и левым соединением с оборотами, как в статье https://infostart.ru/1c/articles/102435/
Пример исправленного последнего блока с календарём дней:
|ВЫБРАТЬ
| Календарь.День КАК Период,
| Движения.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| СУММА(Движения.КоличествоОборот) КАК КоличествоОборот,
| СУММА(Движения.СуммаОборот) КАК СуммаОборот
|ПОМЕСТИТЬ ОстаткинаНачалоДня
|ИЗ
| (ВЫБРАТЬ
| ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, T.n) КАК День
| ИЗ
| (ВЫБРАТЬ 0 КАК n
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ 1
| ОБЪЕДИНИТЬ ВСЕ
| ВЫБРАТЬ 2
| …
| ВЫБРАТЬ 30) КАК T) КАК Календарь
| ЛЕВОЕ СОЕДИНЕНИЕ Движения КАК Движения
| ПО Движения.Период < Календарь.День
|СГРУППИРОВАТЬ ПО
| Календарь.День,
| Движения.ХарактеристикаНоменклатурыЕсли нужна помощь с конкретным запросом под вашу задачу — уточните, что именно хотите получить: остатки на каждый день, обороты, или средние остатки.
-
АвторЗаписи