База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как исправить ошибку инициализации модуля в 1С: «Переменная не определена»? › Ответ в теме: Как исправить ошибку инициализации модуля в 1С: «Переменная не определена»?
Ошибка означает, что в общем модуле КлиентБанкСервер используется переменная ПараметрыДобавленияСтроки, но в текущей процедуре она нигде не объявлена и не создана.
Проблемные строки:
|
1 2 3 4 5 6 7 |
|Если ПараметрыДобавленияСтроки.РаспределяемаяСумма > 0 | Или Не ДокументОбъект.РасшифровкаПлатежа.Количество() Тогда | | ПараметрыДобавленияСтроки.Вставить("ЗаполняемыеРеквизиты", ЗаполняемыеРеквизиты); | | ... | СтрокаДокумента, ДокументОбъект, ПараметрыДобавленияСтроки); |
Это ошибка компиляции, поэтому модуль вообще не может инициализироваться.
## Что проверить в первую очередь
Откройте общий модуль:
|
1 |
Общий модуль «КлиентБанкСервер» |
Найдите процедуру, в которой находятся строки 601, 604 и 606. Посмотрите примерно 30-50 строк выше.
Нужно найти один из вариантов:
|
1 |
ПараметрыДобавленияСтроки = Новый Структура; |
или параметр процедуры:
|
1 |
Процедура ...(..., ПараметрыДобавленияСтроки) Экспорт |
или вызов процедуры, где эта переменная должна была передаваться.
Скорее всего, при доработке или объединении конфигурации была удалена строка создания переменной либо изменено имя переменной.
## Возможное исправление
Если ПараметрыДобавленияСтроки должна быть локальной структурой, перед первым обращением к ней нужно добавить:
|
1 2 |
ПараметрыДобавленияСтроки = Новый Структура; ПараметрыДобавленияСтроки.Вставить("РаспределяемаяСумма", 0); |
После этого существующий код сможет работать:
|
1 2 3 4 5 6 7 8 9 10 11 |
Если ПараметрыДобавленияСтроки.РаспределяемаяСумма > 0 Или Не ДокументОбъект.РасшифровкаПлатежа.Количество() Тогда ПараметрыДобавленияСтроки.Вставить("ЗаполняемыеРеквизиты", ЗаполняемыеРеквизиты); ДобавитьСтрокуДокумента( СтрокаДокумента, ДокументОбъект, ПараметрыДобавленияСтроки); КонецЕсли; |
Но добавлять только эти две строки без проверки логики не всегда правильно. Нужно понять, откуда должно приходить значение РаспределяемаяСумма.
## Если переменная должна передаваться в процедуру
Возможно, исходная процедура должна выглядеть примерно так:
|
1 2 3 4 |
Процедура ЗаполнитьСтрокуДокумента( СтрокаДокумента, ДокументОбъект, ПараметрыДобавленияСтроки) Экспорт |
Тогда исправлять нужно не созданием структуры внутри процедуры, а добавлением параметра во все вызовы этой процедуры.
Например:
|
1 2 3 4 5 6 7 |
ПараметрыДобавленияСтроки = Новый Структура; ПараметрыДобавленияСтроки.Вставить("РаспределяемаяСумма", РаспределяемаяСумма); ЗаполнитьСтрокуДокумента( СтрокаДокумента, ДокументОбъект, ПараметрыДобавленияСтроки); |
Внутри вызываемой процедуры:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Процедура ЗаполнитьСтрокуДокумента( СтрокаДокумента, ДокументОбъект, ПараметрыДобавленияСтроки) Экспорт Если ПараметрыДобавленияСтроки.РаспределяемаяСумма > 0 Или Не ДокументОбъект.РасшифровкаПлатежа.Количество() Тогда ПараметрыДобавленияСтроки.Вставить( "ЗаполняемыеРеквизиты", ЗаполняемыеРеквизиты); КонецЕсли; КонецПроцедуры |
## Более надежный вариант с проверкой ключа
Если структура может приходить без ключа РаспределяемаяСумма, лучше обращаться к нему через Свойство:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
РаспределяемаяСумма = 0; Если ПараметрыДобавленияСтроки.Свойство( "РаспределяемаяСумма", РаспределяемаяСумма) Тогда // Значение получено из структуры КонецЕсли; Если РаспределяемаяСумма > 0 Или Не ДокументОбъект.РасшифровкаПлатежа.Количество() Тогда ПараметрыДобавленияСтроки.Вставить( "ЗаполняемыеРеквизиты", ЗаполняемыеРеквизиты); КонецЕсли; |
Но этот вариант исправляет возможную ошибку отсутствующего ключа. В вашей ситуации текущая ошибка возникает раньше, потому что отсутствует сама переменная.
## Проверьте похожие имена переменных
В модуле может использоваться другое имя, например:
|
1 2 3 4 5 |
ПараметрыДобавленияСтрок ПараметрыДобавления ПараметрыСтроки ПараметрыЗаполненияСтроки ПарамДобавленияСтроки |
Если выше по коду создана другая переменная, например:
|
1 |
ПараметрыСтроки = Новый Структура; |
а ниже написано:
|
1 |
ПараметрыДобавленияСтроки.Вставить(...); |
то нужно либо заменить имя в строках 601, 604 и 606:
|
1 |
ПараметрыСтроки.Вставить("ЗаполняемыеРеквизиты", ЗаполняемыеРеквизиты); |
либо переименовать локальную переменную единообразно.
В конфигураторе используйте поиск по модулю и найдите все вхождения:
|
1 |
ПараметрыДобавленияСтроки |
Проверьте:
1. где переменная создается;
2. где ей присваивается значение;
3. в каких процедурах она используется;
4. не находится ли ее объявление в другой процедуре;
5. не закомментирована ли строка создания;
6. нет ли опечатки в имени.
Переменная, созданная в одной процедуре, недоступна в другой:
|
1 2 3 4 5 6 7 8 |
Процедура Процедура1() ПараметрыДобавленияСтроки = Новый Структура; КонецПроцедуры Процедура Процедура2() // Здесь переменная не существует ПараметрыДобавленияСтроки.Вставить("Ключ", Значение); КонецПроцедуры |
## Частая причина: повреждено расширение
Имя:
|
1 |
ЗаполнениеКассовыхБанковскихДок |
похоже на имя расширения или дополнительного модуля, который изменяет стандартную обработку заполнения кассовых и банковских документов.
Если конфигурация типовая, проверьте:
1. установлены ли последние обновления конфигурации;
2. включено ли расширение;
3. не изменялся ли общий модуль вручную;
4. нет ли нескольких расширений, изменяющих один и тот же модуль;
5. не осталось ли старое расширение после обновления;
6. не выполнялось ли некорректное объединение конфигураций.
В конфигураторе проверьте:
|
1 2 |
Конфигурация Расширения конфигурации |
Временно отключите подозрительное расширение и проверьте запуск. Если ошибка исчезла, причина находится в расширении.
Если модуль принадлежит расширению, исправлять типовую конфигурацию не нужно. Исправление выполняется в расширении или устанавливается корректная версия расширения от разработчика.
## Если ошибка появилась после обновления
Наиболее правильный порядок действий:
1. Сделать резервную копию информационной базы.
2. Сравнить общий модуль КлиентБанкСервер с модулем из поставки текущего релиза.
3. Найти блок возле строк 601-606.
4. Проверить, не пропала ли строка инициализации переменной.
5. Проверить изменения в расширениях.
6. Выполнить проверку конфигурации с исправлением ссылочной целостности.
7. Обновить конфигурацию базы данных.
8. Перезапустить клиент 1С.
Сравнение с поставкой особенно важно, потому что простое добавление:
|
1 |
ПараметрыДобавленияСтроки = Новый Структура; |
может убрать ошибку компиляции, но нарушить алгоритм заполнения документов.
## Что нельзя делать
Не следует объявлять переменную глобально только для устранения ошибки:
|
1 |
Перем ПараметрыДобавленияСтроки; |
Это может скрыть настоящую проблему. Кроме того, общий модуль с клиентским и серверным контекстом может работать в разных сеансах и контекстах выполнения.
Также нельзя просто удалить строки:
|
1 2 |
Если ПараметрыДобавленияСтроки.РаспределяемаяСумма > 0 ... ПараметрыДобавленияСтроки.Вставить(...) |
Эти строки, вероятно, участвуют в распределении суммы по расшифровке платежа.
## Наиболее вероятное исправление
Если в исходной процедуре действительно не хватает создания структуры, блок должен начинаться примерно так:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
ПараметрыДобавленияСтроки = Новый Структура; ПараметрыДобавленияСтроки.Вставить( "РаспределяемаяСумма", РаспределяемаяСумма); Если ПараметрыДобавленияСтроки.РаспределяемаяСумма > 0 Или Не ДокументОбъект.РасшифровкаПлатежа.Количество() Тогда ПараметрыДобавленияСтроки.Вставить( "ЗаполняемыеРеквизиты", ЗаполняемыеРеквизиты); СтрокаДокумента = ДобавитьСтрокуДокумента( СтрокаДокумента, ДокументОбъект, ПараметрыДобавленияСтроки); КонецЕсли; |
Но имя РаспределяемаяСумма в этом примере нужно заменить на фактическую переменную из вашего кода.
Если такой переменной в процедуре нет, нужно посмотреть исходный код процедуры целиком: значение должно приходить из суммы платежа, суммы строки или результата распределения платежа.
По представленному тексту ошибки точно видно только одно: переменная ПараметрыДобавленияСтроки отсутствует в области видимости. Для окончательного исправления нужно сравнить код процедуры примерно от 560-й до 620-й строки с типовой версией текущего релиза.