При автоматизации формирования файлов Excel из 1С через COM-соединение часто возникает ситуация, когда формулы в ячейках «застывают». Например, при заполнении нескольких строк по шаблону, формула, которая должна ссылаться на текущую строку, продолжает указывать на первую ячейку. Давайте разберем, почему это происходит и как правильно управлять ссылками в формулах.
Основная причина заключается в том, как Excel интерпретирует переданную ему строку формулы. Существует два основных способа записи ссылок:
=B1+C1). Это абсолютная привязка к конкретному адресу ячейки.=RC[-2] означает взять значение из ячейки, находящейся на два столбца левее в той же строке.Когда вы записываете формулу в Excel через 1С с помощью свойства FormulaLocal, Excel пытается интерпретировать полученную строку в соответствии с текущими настройками стиля ссылок приложения. Если по умолчанию у пользователя стоит стиль A1, то любая переданная вами относительная ссылка может быть либо воспринята некорректно, либо принудительно преобразована в фиксированный адрес, который не будет меняться при программной вставке в другие строки.
Чтобы избежать зависимости от настроек пользователя и заставить Excel понимать формулы правильно, используйте свойства FormulaR1C1 или FormulaR1C1Local. Они всегда работают с R1C1-синтаксисом, независимо от региональных настроек или параметров приложения.
Рассмотрим, как правильно читать и записывать формулы. Вместо того чтобы считывать формулу как FormulaLocal, используйте следующий подход:
// Правильное чтение формулы из шаблона для сохранения относительности
ФормулаИзШаблона = ExcelЛист.Cells(1, 4).FormulaR1C1Local;
// Запись в целевую ячейку в цикле
Для ИндексСтроки = 1 По КоличествоСтрок Цикл
ExcelЛист.Cells(ИндексСтроки, 4).FormulaR1C1Local = ФормулаИзШаблона;
КонецЦикла;
Когда вы используете метод FormulaR1C1Local, вы прямо сообщаете приложению Excel: «Эта строка содержит относительные смещения». Даже если вы вставляете формулу в разные строки (первую, вторую, третью), Excel, видя нотацию RC (Row-Column), будет автоматически рассчитывать смещение от текущей активной ячейки.
Если в шаблоне у вас записана формула =--RC[-2], то при записи в ячейку D1 она будет смотреть на B1, а при записи в D2 — на B2, так как Excel воспринимает C[-2] как «два столбца назад от текущего положения».
FormulaR1C1Local. Это позволит 1С получить строку вида =RC[-2], а не интерпретированный Excel-ом адрес =B1.FormulaR1C1Local. Это гарантирует корректную трансляцию формул в новые строки.Alt+F11, откройте окно интерпретации (Immediate Window) и введите ? ActiveCell.FormulaR1C1. Вы увидите реальный формат записи, который необходимо использовать в 1С.Применяя этот подход, вы избавитесь от проблем с «застывшими» адресами и сделаете формирование отчетов в Excel более надежным и предсказуемым.