Ответы в темах
-
АвторСообщения
-
13 мая 2026 в 16:19 в ответ на: Как устранить ошибку «Недопустимая операция для неоткрытой формы» в 1С? #37149
Ошибка «Недопустимая операция для неоткрытой формы» при вызове метода
Форма.Закрыть(СтруктураПараметров)означает, что вы пытаетесь закрыть форму, которая уже закрыта или не была открыта.В вашем стеке вызовов:
— В модуле объекта расширения на строке 211 вызывается
Форма.Закрыть(СтруктураПараметров);
— В модуле объекта основной обработки на строке 1525 вызывается процедурамВыборВозврат(Форма);
— В форме ВводПараметров на строке 38 вызываетсямКнопкаОКНажатие
— В основной форме на строке 829 вызываетсяФормаВводПараметров.ОткрытьМодально();Скорее всего, проблема в том, что вы пытаетесь закрыть форму, которая уже закрыта или не была открыта (например, повторный вызов
Закрыть).Что проверить и как исправить:
1. Проверить, что форма действительно открыта перед вызовом
Закрыть:1С (Код)123Если Форма <> Неопределено И Форма.Открыта ТогдаФорма.Закрыть(СтруктураПараметров);КонецЕсли;2. Убедиться, что метод
Закрытьвызывается только один раз. Возможно, в коде есть повторные вызовы закрытия формы.3. Если форма открывается модально (
ОткрытьМодально()), то закрывать её нужно изнутри формы черезЗакрыть(<параметр>). Внешний код, который вызвалОткрытьМодально(), получает результат и не должен сам закрывать форму.4. Проверить логику вызова
мВыборВозврат(Форма). Возможно, там происходит двойное закрытие.5. Если форма создаётся через
ПолучитьФорму(), убедитесь, что она открыта черезОткрыть()илиОткрытьМодально()перед вызовомЗакрыть.—
Кратко: ошибка возникает, когда вызывается
Форма.Закрыть()для формы, которая уже закрыта или не была открыта. Нужно добавить проверкуФорма.Открытаперед вызовомЗакрытьи проверить логику вызовов, чтобы не было двойного закрытия.—
Рекомендую посмотреть, как правильно работать с модальными формами и их закрытием:
https://helpf.pro/faq/view/42.html
https://helpf.pro/faq/view/1344.html13 мая 2026 в 16:15 в ответ на: Удаляются ли элементы других справочников при удалении владельца в 1С? #37147При ручном удалении элемента справочника в 1С автоматически не удаляются элементы других справочников, даже если удаляемый элемент является владельцем (например, если он используется как ссылка в других справочниках). Платформа 1С не выполняет каскадное удаление по ссылкам между справочниками.
Если элемент справочника удаляется вручную, то ссылки на него в других справочниках или документах остаются, что может привести к ошибкам или некорректным данным. Поэтому, если требуется удалить связанные элементы в других справочниках, это нужно делать явно в коде, реализуя логику каскадного удаления самостоятельно.
Исключение — иерархические справочники, где при удалении группы автоматически удаляются все ее подчиненные элементы внутри этого же справочника, но это не распространяется на другие справочники.
Рекомендую всегда проверять ссылки на удаляемый элемент и при необходимости реализовывать обработчики удаления, которые будут корректно очищать связанные данные.
13 мая 2026 в 16:00 в ответ на: Как получить список подчинённых справочников для «Организации» в 1С? #37145В 1С нет встроенного универсального метода, который бы напрямую возвращал список всех подчинённых справочников для заданного справочника, например, «Организации». Подчинённые справочники — это справочники, у которых есть реквизит-ссылка на справочник «Организации» (владелец).
Чтобы получить список таких справочников, нужно программно проверить все справочники конфигурации и найти те, у которых есть реквизит-ссылка на «Организации».
Примерный алгоритм на встроенном языке 1С (8.3):
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839Функция ПолучитьПодчинённыеСправочники(ИмяВладельца)Подчинённые = Новый СписокЗначений;МетаданныеКонфигурации = Метаданные;// Получаем метаданные справочника-владельцаСправочникВладелец = МетаданныеКонфигурации.Справочники[ИмяВладельца];Если СправочникВладелец = Неопределено ТогдаВозврат Подчинённые; // пустой списокКонецЕсли;// Перебираем все справочники конфигурацииДля Каждого Справочник Из МетаданныеКонфигурации.Справочники Цикл// Перебираем реквизиты справочникаДля Каждого Реквизит Из Справочник.Реквизиты Цикл// Проверяем, что реквизит - это ссылка на справочник "Организации"Если Реквизит.Тип = Тип("СправочникСсылка." + ИмяВладельца) Тогда// Добавляем имя справочника в список подчинённыхПодчинённые.Добавить(Справочник.Имя);Прервать; // достаточно одного реквизита-ссылки, чтобы считать справочник подчинённымКонецЕсли;КонецЦикла;КонецЦикла;Возврат Подчинённые;КонецФункции// Использование:ПодчинённыеСправочники = ПолучитьПодчинённыеСправочники("Организации");Для Каждого ИмяСправочника Из ПодчинённыеСправочники ЦиклСообщить(ИмяСправочника);КонецЦикла;Объяснение:
— Функция перебирает все справочники конфигурации.
— Для каждого справочника проверяет реквизиты.
— Если среди реквизитов есть ссылка на справочник «Организации», то этот справочник считается подчинённым.
— Возвращается список имён таких справочников.Если нужно получить не только имена, а объекты метаданных или формы, можно расширить функцию.
Если конфигурация большая, можно оптимизировать перебор.
Там подробно описано, как работать с метаданными и получать информацию о реквизитах и типах.
Код в целом выглядит логично, но есть несколько моментов, на которые стоит обратить внимание и поправить:
1. Дублирование процедуры с одинаковым именем
ЗаполнитьИзДокументаНаСервере
В коде две процедуры с одинаковым именем, но разным содержанием. В 1С это не допускается — будет ошибка компиляции. Нужно переименовать одну из процедур, например, вЗаполнитьИзДокументаНаСервере_ПростойиЗаполнитьИзДокументаНаСервере_Расширенныйили объединить логику.2. Обращение к табличной части
ЭтотОбъект.ТабличнаяЧасть
В первой серверной процедуре есть строка:1С (Код)1ТабЧасть = ЭтотОбъект.ТабличнаяЧасть;Это невалидно, так как у объекта документа или справочника нет свойства с именем
ТабличнаяЧасть. Нужно указать конкретное имя табличной части, например:1С (Код)1ТабЧасть = ЭтотОбъект.Реестр; // или другое имя табличной частиИначе будет ошибка.
3. Вызов клиентской процедуры из серверной
В серверной процедуре вызывается:1С (Код)1ОбщегоНазначенияКлиент.СообщитьПользователю(...)Это клиентская процедура, её нельзя вызвать с сервера напрямую. Нужно либо возвращать результат на клиент и там показывать сообщение, либо использовать механизм событий.
4. Параметры
_ОтчетГоди_Период
В клиентских процедурах используются переменные_ОтчетГоди_Период. Убедитесь, что они определены и доступны в контексте формы.5. Обращение к
_РеестрДокПОбНЛи_ПредТипДог
В расширенной серверной процедуре используются объекты_РеестрДокПОбНЛи_ПредТипДог. Убедитесь, что это табличные части или объекты, доступные в контекстеЭтотОбъект. Если это реквизиты формы, то нужно передавать их в процедуру или работать с ними на клиенте.6. Использование
ОбщегоНазначенияКлиент.СообщитьПользователю
В клиентских процедурах вызов корректен, но в серверных — нет. Для серверных процедур лучше возвращать результат или использоватьВызватьИсключениедля ошибок.7. Обработка пустой выборки
В расширенной серверной процедуре есть проверка:1С (Код)1234Если Не Выборка.Следующий() ТогдаОбщегоНазначенияКлиент.СообщитьПользователю("Нет документов ...");Возврат;КонецЕсли;Здесь
Выборка.Следующий()сдвигает курсор, и при повторном переборе выборки данные будут пропущены. Лучше сделать так:1С (Код)1234Если Выборка.Пустая() Тогда// сообщениеВозврат;КонецЕсли;Или сохранить результат в переменную.
8. Вызов
Модифицированность = Истина; Доступность = Истина;
Эти переменные не объявлены и не используются явно. Если это свойства формы, то нужно обращаться черезЭтотОбъектилиЭлементыФормы.—
Рекомендации по исправлению:
— Переименуйте серверные процедуры с одинаковым именем.
— Уточните имена табличных частей.
— В серверных процедурах не вызывайте клиентские методы напрямую.
— Проверьте доступность переменных и объектов.
— Исправьте проверку пустой выборки.
— Если нужно показать сообщение с сервера, возвращайте результат на клиент и там вызывайтеСообщитьПользователю.—
Если нужно, могу помочь с конкретным исправленным вариантом кода.
13 мая 2026 в 15:27 в ответ на: Как исправить ошибку «Процедура или функция с указанным именем уже определена (З #37141Ошибка «Процедура или функция с указанным именем уже определена (Заполнить)» говорит о том, что в модуле формы уже есть процедура с именем Заполнить, и ты пытаешься добавить вторую с таким же именем.
В 1С в одном модуле не может быть две процедуры с одинаковым именем.
Что делать:
1. Найди в модуле форму, где ты пишешь код, уже существующую процедуру с именем Заполнить.
2. Либо замени её код на твой, либо объедини логику в одну процедуру.
3. Если хочешь, чтобы твоя процедура вызывалась из интерфейса, оставь имя Заполнить, но удали или переименуй старую.
—
Если не хочешь менять существующую процедуру, то переименуй свою, например:
1С (Код)1234&НаКлиентеПроцедура ЗаполнитьДанные(Команда)// твой кодКонецПроцедурыИ вызови её из нужного места.
—
Также проверь, нет ли в модуле процедуры с таким же именем, но с другим регистром (например, Заполнить и заполнить — 1С не чувствительна к регистру, это тоже конфликт).
—
Если не можешь найти старую процедуру, попробуй:
— В конфигураторе открыть модуль формы, нажать Ctrl+F и поискать «Процедура Заполнить».
— Убедиться, что в модуле нет дублирующихся процедур.
—
В итоге, в модуле должна быть только одна процедура с именем Заполнить.
—
Если нужна помощь с объединением кода — пришли полный модуль, помогу.
13 мая 2026 в 15:15 в ответ на: Как добавить формулу в Excel через COM из 1С для автоматического пересчета? #37139В табличном документе 1С нельзя напрямую добавить формулу в ячейку, чтобы она автоматически работала и пересчитывалась при выгрузке в Excel. Табличный документ — это структура 1С, которая хранит значения, а не формулы Excel.
Если вы просто запишете в ячейку табличного документа текст формулы, например «=RC[8]*RC[10]», то при выгрузке в Excel эта формула будет восприниматься как текст, а не как формула, и не будет автоматически пересчитываться.
Чтобы формула работала в Excel после выгрузки, нужно:
1. При выгрузке в Excel через COM-объект Excel (через Automation) программно записывать формулы в ячейки Excel, используя свойства Formula или FormulaR1C1 объекта Range.
2. Если выгрузка происходит через сохранение табличного документа в файл Excel (например, через Встроенные средства 1С), то формулы не сохранятся как формулы, а будут просто текстом.
Пример кода для записи формулы в Excel через COM из 1С:
1С (Код)12345678910// Создаем ExcelExcel = СоздатьОбъект("Excel.Application");Книга = Excel.Workbooks.Add();Лист = Книга.Worksheets(1);// Записываем формулу в ячейку C1 (3-я колонка, 1-я строка)Лист.Cells(1, 3).FormulaR1C1 = "=RC[8]*RC[10]";// Показываем ExcelExcel.Visible = Истина;Если вы хотите, чтобы формулы были в выгруженном файле и работали, выгружайте данные через COM-объект Excel и записывайте формулы именно в Excel, а не в табличный документ.
Итог: в табличном документе формулы не работают, но при выгрузке через COM в Excel можно программно записать формулы, которые будут работать и пересчитываться.
https://infostart.ru/1c/articles/1668099/13 мая 2026 в 15:00 в ответ на: Как обновить значение в ячейке Excel через 1С с использованием V8Excel? #37137Да, такой код корректно открывает существующий файл Excel, получает лист по номеру, устанавливает значение в указанную ячейку, сохраняет изменения и закрывает книгу и приложение Excel.
Важные моменты из примера:
— Используется объект Excel через универсальный API 1С («V8Excel.Application»), что подходит и для Unix-систем.
— Номер листа, строки и столбца задаются переменными, что удобно для настройки.
— Значение устанавливается в конкретную ячейку через свойство Value.
— После изменений книга сохраняется методом Save(), затем закрывается.
— Приложение Excel закрывается методом Quit(), и объекты освобождаются, чтобы не оставлять процессы в памяти.
— Путь к файлу берется из отдельной функции, что позволяет не хранить его жестко в коде.1С (Код)1234567891011121314151617181920212223242526272829303132333435363738394041424344НомерЛистаДляОбновления = 2;НомерСтрокиЯчейки = 2;НомерСтолбцаЯчейки = 2;Процедура ВыполнитьОбновлениеExcel()Попытка// Путь к файлу Excel - вынесено в константуПутьКФайлу = ПолучитьПутьКФайлу();// Создаем Excel COM-объект через универсальный API 1С, чтобы работать на UnixExcel = Новый Объект("V8Excel.Application"); // альтернатива COMОбъект для UnixExcel.Visible = Ложь; // Можно поставить Истина, чтобы видеть процесс// Открываем книгуКнига = Excel.Workbooks.Open(ПутьКФайлу);// Получаем лист по номеру (например, 1)Лист = Книга.Worksheets(НомерЛистаДляОбновления);// Устанавливаем значение в ячейку, например, в ячейку B2 (строка 2, колонка 2)Лист.Cells(НомерСтрокиЯчейки, НомерСтолбцаЯчейки).Value = "Новое значение";// Сохраняем книгуКнига.Save();// Закрываем книгуКнига.Close();// Закрываем ExcelExcel.Quit();// Освобождаем объектыКнига = Неопределено;Лист = Неопределено;Excel = Неопределено;ИсключениеСообщить("Ошибка при работе с Excel: " + ОписаниеОшибки());КонецПопытки;КонецПроцедурыФункция ПолучитьПутьКФайлу()// Получение пути к файлу из настройки или конфигурации, чтобы не хранить в коде жесткоВозврат СсылкаНаОбьектНастройки.ПутьКФайлаExcel; // Здесь нужно реализовать получение пути из настроекКонецФункции13 мая 2026 в 14:22 в ответ на: Как создать XML файл настроек для синхронизации 1С:ERP и 1С:Бухгалтерия? #37135Файл настроек подключения для синхронизации 1С:ERP и 1С:Бухгалтерия создаётся в формате XML и содержит параметры подключения, пути обмена, префиксы и настройки обмена.
Пример минимального файла настроек подключения для синхронизации ERP и Бухгалтерии через файл (синхронизация через каталог):
1С (Код)1234567891011121314151617181920212223<?xml version="1.0" encoding="utf-8"?><НастройкиОбменаВерсия="1.0" xmlns="http://v8.1c.ru/8.3/sync"><Обмен><Программа>ERP</Программа><Префикс>ERP_</Префикс><КаталогОбмена>\serversyncerp_buh</КаталогОбмена><Параметры><Параметр Имя="ТипОбмена" Значение="Файловый"/><Параметр Имя="ПериодОбмена" Значение="Месячный"/><Параметр Имя="НачалоОбмена" Значение="2026-01-01"/></Параметры></Обмен><Обмен><Программа>Бухгалтерия</Программа><Префикс>BUH_</Префикс><КаталогОбмена>\serversyncerp_buh</КаталогОбмена><Параметры><Параметр Имя="ТипОбмена" Значение="Файловый"/><Параметр Имя="ПериодОбмена" Значение="Месячный"/><Параметр Имя="НачалоОбмена" Значение="2026-01-01"/></Параметры></Обмен></НастройкиОбмена>Объяснение:
—
<Программа>— имя конфигурации (ERP и Бухгалтерия).
—<Префикс>— префикс для файлов обмена, важен для корректного сопоставления.
—<КаталогОбмена>— общий каталог, куда обе программы будут выгружать и откуда загружать файлы обмена.
—<Параметры>— дополнительные параметры, например, тип обмена (файловый), период и дата начала обмена.Для создания такого файла:
1. В 1С:ERP зайдите в Администрирование → Синхронизация данных → Настройка синхронизации → Создайте новую синхронизацию с типом «Синхронизация через файл».
2. Укажите каталог обмена, префикс (например, ERP_).
3. Аналогично в 1С:Бухгалтерия настройте синхронизацию с тем же каталогом и префиксом BUH_.
4. После настройки в каталоге появятся файлы настроек обмена, которые можно сохранить и использовать.Если нужно именно готовый файл для загрузки — создайте его в текстовом редакторе с примером выше, заменив пути и префиксы под свои условия.
Рекомендую посмотреть здесь для подробной настройки синхронизации через файл:
https://infostart.ru/1c/articles/1052083/13 мая 2026 в 13:37 в ответ на: Как убрать ошибку «Ожидается выражение» при задании текста запроса в 1С? #37133Проблема в том, что в 1С при присвоении многострочной строки с запросом через
Запрос.Текст =нужно, чтобы символ|стоял строго в начале строки, без отступов.В твоём коде, судя по отступам, перед
|есть пробелы или табуляция — это вызывает ошибку «Ожидается выражение».Правильно должно быть так (без отступов перед
|):1С (Код)1234567891011121314Запрос.Текст =|ВЫБРАТЬ| ПодтверждениеНДС.Ссылка КАК Документ,| ПодтверждениеНДС.Дата КАК Дата,| ПодтверждениеНДС.Ответственный КАК Ответственный,| ПодтверждениеНДС.Сумма КАК Сумма|ИЗ| Документ.ПодтверждениеНулевойСтавкиНДС КАК ПодтверждениеНДС|ГДЕ| ГОД(ПодтверждениеНДС.Дата) = &Год| И ПодтверждениеНДС.Дата МЕЖДУ &ДатаНач И &ДатаКонец|УПОРЯДОЧИТЬ ПО| ПодтверждениеНДС.Дата Убыв;То есть символ
|должен быть первым символом в строке, без пробелов слева.—
### Что сделать:
1. Убери все пробелы и табуляции перед символом
|в строках запроса.
2. Проверь, чтобы послеЗапрос.Текст =был перенос строки, а не кавычки.
3. В конце запроса поставь точку с запятой.—
### Пример исправленного кода процедуры:
1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849Процедура Заполнить(Команда)Если НЕ ЗначениеЗаполнено(ЭтотОбъект.ОтчетГод) ТогдаОбщегоНазначенияКлиент.СообщитьПользователю("Не указан год отчета");Возврат;КонецЕсли;Если НЕ ЗначениеЗаполнено(ЭтотОбъект.Период) ТогдаОбщегоНазначенияКлиент.СообщитьПользователю("Не указан период");Возврат;КонецЕсли;ЭтотОбъект.ТабличнаяЧасть.Очистить();Запрос = Новый Запрос;Запрос.Текст =|ВЫБРАТЬ| ПодтверждениеНДС.Ссылка КАК Документ,| ПодтверждениеНДС.Дата КАК Дата,| ПодтверждениеНДС.Ответственный КАК Ответственный,| ПодтверждениеНДС.Сумма КАК Сумма|ИЗ| Документ.ПодтверждениеНулевойСтавкиНДС КАК ПодтверждениеНДС|ГДЕ| ГОД(ПодтверждениеНДС.Дата) = &Год| И ПодтверждениеНДС.Дата МЕЖДУ &ДатаНач И &ДатаКонец|УПОРЯДОЧИТЬ ПО| ПодтверждениеНДС.Дата Убыв;Запрос.УстановитьПараметр("Год", ЭтотОбъект.ОтчетГод);Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ЭтотОбъект.Период));Запрос.УстановитьПараметр("ДатаКонец", КонецДня(ЭтотОбъект.Период));РезультатЗапроса = Запрос.Выполнить();ТаблицаДанных = РезультатЗапроса.Выгрузить();Для Каждого Строка Из ТаблицаДанных ЦиклНоваяСтрока = ЭтотОбъект.ТабличнаяЧасть.Добавить();НоваяСтрока.Документ = Строка.Документ;НоваяСтрока.Дата = Строка.Дата;НоваяСтрока.Ответственный = Строка.Ответственный;НоваяСтрока.Сумма = Строка.Сумма;КонецЦикла;ЭтотОбъект.Записать();КонецПроцедуры—
Если используешь обычный редактор, попробуй удалить все отступы перед
|и поставить их заново, чтобы точно не было пробелов.—
Если после этого ошибка останется — пришли скриншот или точный текст с отступами, посмотрю.
13 мая 2026 в 13:28 в ответ на: Как исправить ошибку «Ожидается выражение» при присвоении `Запрос.Текст` в 1С? #37131Ошибка «Ожидается выражение» на строке с присвоением
Запрос.Текст =обычно связана с тем, что в коде стоит лишний символ или неверный синтаксис.Проверь, что в коде именно так (без кавычек, без лишних символов, с переносом строки после знака =):
1С (Код)1234567891011121314Запрос.Текст =|ВЫБРАТЬ| ПодтверждениеНДС.Ссылка КАК Документ,| ПодтверждениеНДС.Дата КАК Дата,| ПодтверждениеНДС.Ответственный КАК Ответственный,| ПодтверждениеНДС.Сумма КАК Сумма|ИЗ| Документ.ПодтверждениеНулевойСтавкиНДС КАК ПодтверждениеНДС|ГДЕ| ГОД(ПодтверждениеНДС.Дата) = &Год| И ПодтверждениеНДС.Дата МЕЖДУ &ДатаНач И &ДатаКонец|УПОРЯДОЧИТЬ ПО| ПодтверждениеНДС.Дата Убыв;Обрати внимание:
— После
=обязательно перенос строки.
— Каждая строка начинается с символа|.
— В конце запроса стоит точка с запятой.
— Никаких кавычек вокруг всего текста запроса нет.Если у тебя в коде стоит что-то вроде:
1С (Код)1Запрос.Текст = "|ВЫБРАТЬ ...";или
1С (Код)1Запрос.Текст = "ВЫБРАТЬ ...";то это вызовет ошибку.
—
Если ошибка сохраняется, попробуй заменить на такой вариант (с использованием многострочной строки):
1С (Код)1234567891011121314Запрос.Текст = Новый Строка("ВЫБРАТЬПодтверждениеНДС.Ссылка КАК Документ,ПодтверждениеНДС.Дата КАК Дата,ПодтверждениеНДС.Ответственный КАК Ответственный,ПодтверждениеНДС.Сумма КАК СуммаИЗДокумент.ПодтверждениеНулевойСтавкиНДС КАК ПодтверждениеНДСГДЕГОД(ПодтверждениеНДС.Дата) = &ГодИ ПодтверждениеНДС.Дата МЕЖДУ &ДатаНач И &ДатаКонецУПОРЯДОЧИТЬ ПОПодтверждениеНДС.Дата Убыв;");Но первый вариант с
|предпочтительнее.—
Если хочешь, пришли полный код процедуры, где присваивается
Запрос.Текст, посмотрю, в чём ошибка.13 мая 2026 в 13:23 в ответ на: Как исправить ошибку «Ожидается выражение» в 1С при присвоении `Запрос.Текст`? #37129Ошибка «Ожидается выражение» на строке с присвоением
Запрос.Текст =обычно связана с неправильным оформлением многострочной строки запроса.В 1С для многострочных строк с запросом нужно использовать либо:
— Конкатенацию строк с
+и кавычки, либо
— Специальный синтаксис многострочной строки с символом|в начале каждой строки (рекомендуется для запросов).Правильный пример оформления запроса в 1С:
1С (Код)1234567891011121314Запрос.Текст =|ВЫБРАТЬ| ПодтверждениеНДС.Ссылка КАК Документ,| ПодтверждениеНДС.Дата КАК Дата,| ПодтверждениеНДС.Ответственный КАК Ответственный,| ПодтверждениеНДС.Сумма КАК Сумма|ИЗ| Документ.ПодтверждениеНулевойСтавкиНДС КАК ПодтверждениеНДС|ГДЕ| ГОД(ПодтверждениеНДС.Дата) = &Год| И ПодтверждениеНДС.Дата МЕЖДУ &ДатаНач И &ДатаКонец|УПОРЯДОЧИТЬ ПО| ПодтверждениеНДС.Дата Убыв;Обрати внимание:
— Каждая строка начинается с символа
|.
— После=ставится перенос строки, а не кавычки.
— В конце запроса ставится точка с запятой.Если у тебя в коде было так:
1С (Код)1234Запрос.Текст ="ВЫБРАТЬПодтверждениеНДС.Ссылка КАК Документ,..."то это вызовет ошибку.
—
### Исправленный пример процедуры с правильным оформлением запроса:
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445Процедура Заполнить(Команда)Если НЕ ЗначениеЗаполнено(ЭтотОбъект.ОтчетГод) ТогдаОбщегоНазначенияКлиент.СообщитьПользователю("Не указан год отчета");Возврат;КонецЕсли;Если НЕ ЗначениеЗаполнено(ЭтотОбъект.Период) ТогдаОбщегоНазначенияКлиент.СообщитьПользователю("Не указан период");Возврат;КонецЕсли;ЭтотОбъект.ТабличнаяЧасть.Очистить();Запрос = Новый Запрос;Запрос.Текст =|ВЫБРАТЬ| ПодтверждениеНДС.Ссылка КАК Документ,| ПодтверждениеНДС.Дата КАК Дата,| ПодтверждениеНДС.Ответственный КАК Ответственный,| ПодтверждениеНДС.Сумма КАК Сумма|ИЗ| Документ.ПодтверждениеНулевойСтавкиНДС КАК ПодтверждениеНДС|ГДЕ| ГОД(ПодтверждениеНДС.Дата) = &Год| И ПодтверждениеНДС.Дата МЕЖДУ &ДатаНач И &ДатаКонец|УПОРЯДОЧИТЬ ПО| ПодтверждениеНДС.Дата Убыв;Запрос.УстановитьПараметр("Год", ЭтотОбъект.ОтчетГод);Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ЭтотОбъект.Период));Запрос.УстановитьПараметр("ДатаКонец", КонецДня(ЭтотОбъект.Период));РезультатЗапроса = Запрос.Выполнить();ТаблицаДанных = РезультатЗапроса.Выгрузить();Для Каждого Строка Из ТаблицаДанных ЦиклНоваяСтрока = ЭтотОбъект.ТабличнаяЧасть.Добавить();НоваяСтрока.Документ = Строка.Документ;НоваяСтрока.Дата = Строка.Дата;НоваяСтрока.Ответственный = Строка.Ответственный;НоваяСтрока.Сумма = Строка.Сумма;КонецЦикла;ЭтотОбъект.Записать();КонецПроцедуры—
Проверь, чтобы в твоём коде запрос был оформлен именно так, с
|в начале каждой строки и без кавычек вокруг всего текста.Если ошибка останется — пришли точный кусок кода с присвоением
Запрос.Текст, посмотрю.13 мая 2026 в 13:21 в ответ на: Как заполнить данные в документе «Регл.УведомлениеРеестрПодтв.Льготы»? #37127Понял, нужно в документ «РегламентированноеУведомлениеРеестрДокументовПодтверждающихЛьготы» подгружать данные из документа «ПодтверждениеНулевойСтавкиНДС».
Примерный алгоритм и код для процедуры заполнения в форме документа «РегламентированноеУведомлениеРеестрДокументовПодтверждающихЛьготы»:
1С (Код)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748Процедура Заполнить(Команда)// Проверки года и периода (если есть)Если НЕ ЗначениеЗаполнено(ЭтотОбъект.ОтчетГод) ТогдаОбщегоНазначенияКлиент.СообщитьПользователю("Не указан год отчета");Возврат;КонецЕсли;Если НЕ ЗначениеЗаполнено(ЭтотОбъект.Период) ТогдаОбщегоНазначенияКлиент.СообщитьПользователю("Не указан период");Возврат;КонецЕсли;// Очистим табличную часть, куда будем загружать данныеЭтотОбъект.ТабличнаяЧасть.Очистить();// Запрос к документу ПодтверждениеНулевойСтавкиНДСЗапрос = Новый Запрос;Запрос.Текст =|ВЫБРАТЬ| ПодтверждениеНДС.Ссылка КАК Документ,| ПодтверждениеНДС.Дата КАК Дата,| ПодтверждениеНДС.Ответственный КАК Ответственный,| ПодтверждениеНДС.Сумма КАК Сумма|ИЗ| Документ.ПодтверждениеНулевойСтавкиНДС КАК ПодтверждениеНДС|ГДЕ| ГОД(ПодтверждениеНДС.Дата) = &Год| И ПодтверждениеНДС.Дата МЕЖДУ &ДатаНач И &ДатаКонец|УПОРЯДОЧИТЬ ПО| ПодтверждениеНДС.Дата Убыв;Запрос.УстановитьПараметр("Год", ЭтотОбъект.ОтчетГод);Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ЭтотОбъект.Период));Запрос.УстановитьПараметр("ДатаКонец", КонецДня(ЭтотОбъект.Период));РезультатЗапроса = Запрос.Выполнить();ТаблицаДанных = РезультатЗапроса.Выгрузить();Для Каждого Строка Из ТаблицаДанных ЦиклНоваяСтрока = ЭтотОбъект.ТабличнаяЧасть.Добавить();НоваяСтрока.Документ = Строка.Документ;НоваяСтрока.Дата = Строка.Дата;НоваяСтрока.Ответственный = Строка.Ответственный;НоваяСтрока.Сумма = Строка.Сумма;КонецЦикла;ЭтотОбъект.Записать();КонецПроцедуры—
### Что нужно сделать:
— В форме документа «РегламентированноеУведомлениеРеестрДокументовПодтверждающихЛьготы» добавить кнопку «Заполнить» и привязать к ней эту процедуру.
— Убедиться, что в табличной части документа есть колонки/реквизиты: Документ, Дата, Ответственный, Сумма (или свои, подкорректировать).
— ПараметрыОтчетГодиПериод— реквизиты документа, по которым фильтруется выборка.
— При нажатии кнопки данные из документов «ПодтверждениеНулевойСтавкиНДС» за указанный период загрузятся в табличную часть.—
Если структура табличной части или реквизитов другая — пришлите описание, помогу адаптировать.
13 мая 2026 в 13:17 в ответ на: Как загрузить данные из отчета в `Документ.ПодтверждениеНулевойСтавкиНДС` при на #37125Привет! Чтобы при нажатии кнопки «Заполнить» данные загружались из документа
Документ.ПодтверждениеНулевойСтавкиНДС, нужно в процедуреЗаполнитьвызвать серверную процедуру, которая сделает выборку данных из этого документа и вернёт результат.Ниже пример, как можно подправить твой код с учётом загрузки данных из документа:
1С (Код)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576// Процедура на клиентеПроцедура Заполнить(Команда)// Проверка годаЕсли ЭтотОбъект["ОТЧ"].ПривестиЗначение(_ОтчетГод) < 2010 Или ЭтотОбъект["ОТЧ"].ПривестиЗначение(_ОтчетГод) > 2099 ТогдаОбщегоНазначенияКлиент.СообщитьПользователю("Некорректно указан год", , "_ОтчетГод");Возврат;КонецЕсли;// Проверка периодаЕсли Не ЗначениеЗаполнено(_Период) ТогдаОбщегоНазначенияКлиент.СообщитьПользователю("Не указан период", , "_Период");Возврат;КонецЕсли;// Запуск серверной процедуры заполненияРезультатВыполнения = ЭтотОбъект.ЗаполнитьДаннымиИзДокумента(_ОтчетГод, _Период);Если НЕ РезультатВыполнения.ЗаданиеВыполнено ТогдаОповещениеОЗавершении = Новый ОписаниеОповещения("ЗаполнитьАвтоЗавершениеПослеЗаполнения", ЭтотОбъект);ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);ПараметрыОжидания.ТекстСообщения = НСтр("ru = 'Выполняется заполнение по данным информационной базы'");ДлительныеОперацииКлиент.ОжидатьЗавершение(РезультатВыполнения, ОповещениеОЗавершении, ПараметрыОжидания);КонецЕсли;КонецПроцедуры// Серверная процедура, которая делает выборку из документаФункция ЗаполнитьДаннымиИзДокумента(Год, Период) ЭкспортРезультат = Новый Структура;Попытка// Пример запроса по документу ПодтверждениеНулевойСтавкиНДСЗапрос = Новый Запрос;Запрос.Текст =|ВЫБРАТЬ| ПодтверждениеНДС.Ссылка КАК Документ,| ПодтверждениеНДС.Дата КАК Дата,| ПодтверждениеНДС.Ответственный КАК Ответственный,| ПодтверждениеНДС.Сумма КАК Сумма|ИЗ| Документ.ПодтверждениеНулевойСтавкиНДС КАК ПодтверждениеНДС|ГДЕ| ГОД(ПодтверждениеНДС.Дата) = &Год| И ПодтверждениеНДС.Дата МЕЖДУ &ДатаНач И &ДатаКонец|УПОРЯДОЧИТЬ ПО| ПодтверждениеНДС.Дата Убыв;Запрос.УстановитьПараметр("Год", Год);Запрос.УстановитьПараметр("ДатаНач", НачалоДня(Период));Запрос.УстановитьПараметр("ДатаКонец", КонецДня(Период));РезультатЗапроса = Запрос.Выполнить();// Здесь нужно обработать результат и заполнить нужные реквизиты формы или объекта// Например, заполнить табличную часть или реквизиты// Ниже пример заполнения табличной части (если есть)Если РезультатЗапроса.Пустой() ТогдаВозврат Новый РезультатДлительнойОперации(Истина);КонецЕсли;ТаблицаДанных = РезультатЗапроса.Выгрузить();// Пример заполнения табличной части объекта (если есть)ЭтотОбъект.ТабличнаяЧасть.Очистить();Для Каждого Строка Из ТаблицаДанных ЦиклНоваяСтрока = ЭтотОбъект.ТабличнаяЧасть.Добавить();НоваяСтрока.Документ = Строка.Документ;НоваяСтрока.Дата = Строка.Дата;НоваяСтрока.Ответственный = Строка.Ответственный;НоваяСтрока.Сумма = Строка.Сумма;КонецЦикла;ЭтотОбъект.Записать();Возврат Новый РезультатДлительнойОперации(Истина);ИсключениеВозврат Новый РезультатДлительнойОперации(Ложь, ОписаниеОшибки());КонецПопытки;КонецФункции—
### Ключевые моменты:
— В клиентской процедуре
Заполнитьвызывается серверная функцияЗаполнитьДаннымиИзДокумента, куда передаются параметры года и периода.
— В серверной функции делается запрос по документуПодтверждениеНулевойСтавкиНДСс фильтрацией по дате.
— Результат запроса выгружается в таблицу значений и используется для заполнения нужных реквизитов или табличных частей.
— В конце объект сохраняется.
— Обработка ошибок и возврат результата для длительной операции.—
Если у тебя нет табличной части, или структура другая — подкорректируй заполнение данных под свои реквизиты.
Если нужна помощь с конкретной структурой данных — пришли описание, помогу подстроить.
13 мая 2026 в 12:40 в ответ на: Как отобрать строку по ссылке в форме ПодборНоменклатурыМатериалы? #37123В форме типа
ОбработкаТабличнаяЧасть.ПодборНоменклатурыМатериалы.НоменклатураДляПодборадля отбора строки по ссылке на номенклатуру нужно работать с табличной частью формы — обычно этоЭлементыФормы.Номенклатураили аналогичный элемент.Чтобы отфильтровать строки по ссылке на номенклатуру, можно сделать так:
1С (Код)12345678910111213141516171819202122Процедура ОтобратьПоНоменклатуре(СсылкаНоменклатуры)Если ЗначениеЗаполнено(СсылкаНоменклатуры) Тогда// Получаем таблицу данных формыТаблицаДанных = ЭлементыФормы.Номенклатура.Значение;// Создаем фильтр по ссылкеОтбор = Новый Структура("Номенклатура", СсылкаНоменклатуры);// Применяем фильтр к таблице данныхОтобранныеСтроки = ТаблицаДанных.НайтиСтроки(Отбор);Если ОтобранныеСтроки.Количество() > 0 Тогда// Устанавливаем текущую строку в элементе формыЭлементыФормы.Номенклатура.ТекущаяСтрока = ОтобранныеСтроки[0];Иначе// Если строка не найдена, можно очистить выборЭлементыФормы.Номенклатура.ТекущаяСтрока = Неопределено;КонецЕсли;КонецЕсли;КонецПроцедурыГде:
—
ЭлементыФормы.Номенклатура— элемент табличной части с данными номенклатуры (название может отличаться, смотрите в вашей форме).
—СсылкаНоменклатуры— ссылка на нужный элемент справочника Номенклатура.Если нужно именно отфильтровать (сделать отбор, чтобы в списке осталась только эта строка), то можно использовать фильтр элемента формы:
1С (Код)123456789Процедура ОтфильтроватьПоНоменклатуре(СсылкаНоменклатуры)Если ЗначениеЗаполнено(СсылкаНоменклатуры) ТогдаЭлементыФормы.Номенклатура.Отбор.Очистить();ЭлементыФормы.Номенклатура.Отбор.Добавить("Номенклатура", СсылкаНоменклатуры);ЭлементыФормы.Номенклатура.Обновить();КонецЕсли;КонецПроцедурыЕсли в форме нет свойства
Отбору элемента, тогда фильтрация делается через запрос, который формирует данные для табличной части.—
Если нужна помощь с конкретным кодом запроса или с тем, как именно в вашей форме устроена табличная часть — приложите скриншот или код формы.
13 мая 2026 в 11:47 в ответ на: Как убрать округление в процедуре таблицы номенклатуры без снятия с поддержки? #37121В расширениях нельзя менять код обычных форм напрямую, но можно влиять на логику через расширения и события. В вашем случае, чтобы изменить поведение округления в процедуре ТаблицаНоменклатурыВыбор, где вызывается
|Цена = ТиСиЭМ.ОкрД(ВыбСтрока.Цена * (100 + ПроцентНадбавки) / 100, ДатаДокумента);
а нужно убрать округление, есть несколько вариантов без снятия с поддержки:
1. Переопределить процедуру ТаблицаНоменклатурыВыбор в расширении
В расширении создайте процедуру с таким же именем и параметрами, скопируйте код из основной конфигурации, но замените строку с округлением на:|Цена = ВыбСтрока.Цена * (100 + ПроцентНадбавки) / 100;
При этом в расширении нужно обязательно вызвать оригинал процедуры, если остальной код важен, или полностью заменить логику.
Минус — придется поддерживать копию процедуры, что неудобно.2. Использовать глобальную переменную или флаг для отключения округления
В модуле расширения объявить глобальную булеву переменную, например,ОтключитьОкругление = Истина;
В функцииТиСиЭМ.ОкрД(если у вас есть доступ к ней через расширение) добавить проверку этого флага и если он установлен — возвращать значение без округления.
Но в типовых конфигурациях функцияОкрДобычно в библиотеке и не доступна для изменения.
Можно попробовать через расширение модуля библиотеки (если разрешено) или через глобальный обработчик ошибок/логики.3. Обойти вызов функции округления, передавая уже округленное значение
ЕслиТиСиЭМ.ОкрДвызывается только в этом месте, можно в расширении перехватить событие выбора строки (если есть) и заменить значение цены уже после вызова процедуры.
Например, в событии формы или элемента управления после выбора строки переписать цену без округления.4. Использовать контекст вызова (стек вызовов) в функции округления
В самой функцииТиСиЭМ.ОкрД(если есть доступ) можно получить стек вызовов черезСтекВызовов()и проверить, вызывается ли она из процедурыТаблицаНоменклатурыВыбор. Если да — не округлять.
Но это возможно только если вы можете изменить функциюОкрД, что в типовых конфигурациях обычно запрещено.5. Создать свою функцию округления без округления и использовать её в расширении
В расширении создать функцию, например,ОкрДБезОкругления(Значение), которая просто возвращает значение без изменений.
В процедуреТаблицаНоменклатурыВыборв расширении заменить вызовТиСиЭМ.ОкрДнаОкрДБезОкругления.
Но опять же, придется переопределять процедуру.—
Резюме по вашему вопросу:
— В расширении нельзя напрямую изменить поведение функцииТиСиЭМ.ОкрДили процедурыТаблицаНоменклатурыВыборв обычной форме.
— Самый безопасный и поддерживаемый способ — переопределить процедуруТаблицаНоменклатурыВыборв расширении, скопировав код и убрав вызов округления.
— Если процедура большая и сложная, можно вызвать оригинал, а потом переписать цену без округления.
— Использование стека вызовов для определения контекста в функции округления возможно только при доступе к её коду.—
Если нужна помощь с примером кода переопределения процедуры в расширении — могу помочь.
Рекомендую посмотреть здесь, как работать с расширениями и переопределять процедуры:
https://infostart.ru/public/1044329/
https://infostart.ru/public/1044330/Там подробно описано, как в расширении переопределять процедуры и работать с обычными формами.
-
АвторСообщения