1c77-dev · diff

git:20260716.23d3f7e to git:20260828.2b87e3e

6 added, 6 removed. Audit A to A.

---
name: 1c77-dev
description: >-
Разработка и доработка под 1С:Предприятие 7.7 (она же "77", "семерка"): правка и создание модулей
кода (.1s, кодировка CP1251), форм (.frm), объектов конфигурации (1Cv7.MD), внешних обработок и
отчетов (.ert), плюс разбор и сборка .ert / 1Cv7.MD через GComp. Используй ВСЕГДА, когда задача
касается 1С 7.7: файлы .1s / .ert / .frm / .mdp / 1Cv7.MD; глобальный модуль, модули проведения и
формы 7.7; синтаксис 7.7 (нет типа Булево; ПустаяСтрока; СоздатьОбъект; тернарник ?(); ошибка
компиляции "Выражение должно иметь логический тип"); обход справочников и документов 7.7, выгрузка
через ТаблицаЗначений или FileSystemObject; сборка или разбор внешних обработок 7.7 (gcomp);
миграция данных с 7.7; поиск и правка кириллицы в .1s (обычный grep ее не находит из-за CP1251).
Применяй даже без явного "7.7", если речь о старой конфигурации с файлами .1s/.ert/.md или о
ТиС / Торговле / Бухгалтерии 7.7 / УПП 7.7. НЕ использовать для 1С 8.x: EDT, .bsl, .mdo, .epf, .erf,
.cf, .cfe, управляемые формы, расширения конфигурации (CFE), СКД, Конвертация данных (КД) 2.x,
конфигурации УНФ / ERP / ЗУП / УТ / БП 3.x - для них есть отдельные 1c-* скиллы. Не применять и к
общим задачам с кодировкой CP1251 вне 1С 7.7 (например конвертация csv-файлов).
---
# Разработка под 1С 7.7 (1c77-dev)
Доработка кода, форм, метаданных и внешних обработок 1С:Предприятия 7.7. Версия 7.7 кардинально
отличается от 8.x, и привычные для 8.x приемы тут ломаются. Этот скилл собирает рабочие приемы,
особенности синтаксиса и готовые скрипты.
## Чем 7.7 отличается (читать обязательно)
- **Нет EDT и .bsl/.mdo.** Конфигурация хранится в бинарном `1Cv7.MD`, внешние обработки - в бинарном `.ert`.
Редактируемые исходники получают разбором через **GComp** (текстовые `.1s`, `.frm`, `.mdp`, `.mxl`).
- **Кодировка везде CP1251.** Файлы `.1s`/`.frm`/`.mdp` - не UTF-8. Инструмент Grep (ищет по UTF-8-байтам)
кириллицу в них **не находит**. Read показывает кракозябры. Читать/править - только через Python с
`encoding='cp1251'` (см. `scripts/cp1251_io.py`) либо через MCP-сервер `1c77-metadata`.
- **Синтаксис строже и беднее 8.x.** Нет типа Булево; число в условии `Если` не приводится к логическому;
многих функций 8.x (`ЗначениеЗаполнено`, штатной `ПустаяСтрока` как Булево) нет или ведут себя иначе.
Это источник большинства ошибок компиляции. Подробно: `references/syntax-gotchas-77.md`.
## Карта навигации
Читай нужный файл по ситуации, не загружай все сразу:
| Когда | Файл |
|-------|------|
- | Пишешь/правишь BSL-код 7.7, ловишь ошибку компиляции «Выражение должно иметь логический тип» и т.п. | `references/syntax-gotchas-77.md` |
+ | Пишешь/правишь BSL-код 7.7, ловишь ошибку компиляции "Выражение должно иметь логический тип" и т.п. | `references/syntax-gotchas-77.md` |
| Нужно понять структуру `.1s` / `.frm` / `.mdp` / `.mxl` / `.ert`, что внутри обработки | `references/file-formats-77.md` |
| Надо разобрать `.ert` в исходники или собрать обратно | `references/gcomp.md` |
| Анализ метаданных конфигурации, поиск реквизита, проверка запроса 7.7, окружение | `references/mcp-and-tools.md` |
Скрипты в `scripts/` (запуск с `--help`):
- `cp1251_io.py` - чтение/запись/grep по `.1s` в CP1251 (когда обычный Grep слеп).
- `analyze_module.py` - инвентаризация модуля: `СоздатьОбъект`, типы метаданных, глобальные `гл*`-функции, обращения к реквизитам.
- `patch_by_marker.py` - идемпотентная вставка блока кода по маркеру-якорю (для повторяемых правок).
- `build_ert.py` / `unpack_ert.py` - обертки GComp (сборка/разбор `.ert`) через PowerShell.
## Базовый workflow доработки
1. **Понять объект.** Метаданные и код существующих объектов конфигурации смотри через MCP `1c77-metadata`
(`get_object`, `get_module`, `search_field`, `validate_query`) - это быстрее и точнее ручного парсинга.
Для внешней обработки `.ert` сначала разбери ее GComp (`unpack_ert.py`), затем работай с `.1s`/`.frm`.
Детали: `references/mcp-and-tools.md`, `references/gcomp.md`.
2. **Править код только через CP1251.** Используй `scripts/cp1251_io.py` или Python напрямую
(`Path.read_text(encoding='cp1251')` / `write_text(..., encoding='cp1251', newline='')`).
Никогда не правь `.1s` инструментом, который пишет UTF-8 - сломаешь кодировку всего файла.
Для повторяемых вставок (одинаковый блок в N мест) используй `patch_by_marker.py` - он идемпотентен.
3. **Сверить синтаксис 7.7 ДО сборки.** Прогони мысленно (или поиском) по чек-листу особенностей из
`references/syntax-gotchas-77.md`. Самая частая ошибка: голый вызов функции или число в условии
`Если`/`ИначеЕсли` без операции сравнения. Проверка запросов - `validate_query` MCP `1c77-metadata`.
4. **Собрать `.ert` и проверить.** Сборка - только рабочим GComp через PowerShell (`build_ert.py`).
Перед сборкой - бэкап `.ert`. После - убедиться, что timestamp/размер изменились (GComp молча
не пересобирает при битых аргументах). Финальная компиляция BSL и проверка - при открытии в самой 7.7.
## Самопроверка перед сборкой .ert
Чек-лист прогонять по СВОЕМУ сгенерированному коду ДО вызова gcomp:
- [ ] В условиях `Если`/`Пока` нет голых вызовов функций или чисел - каждое сравнение явное
и в скобках: `(Ф(х)=1) И (у=2)`.
- [ ] `ПустаяСтрока`/`ПустоеЗначение` сравнивать с 1/0.
- [ ] Каждая вызываемая процедура/функция объявлена ВЫШЕ точки вызова или в глобальном
модуле - проверить греп-поиском определения.
- [ ] `Симв()`, не `Символ()`; тернарник `?(усл,а,б)` с явными сравнениями.
- [ ] Нет обращений к несуществующим у 7.7 методам 8.x.
Детали и полный список - `references/syntax-gotchas-77.md`.
- Типовые ошибки компиляции («Выражение должно иметь логический тип», «Процедура не обнаружена»,
- «Плохой тип переменной») - сначала прогнать этот чек-лист, потом лезть в отладку.
+ Типовые ошибки компиляции ("Выражение должно иметь логический тип", "Процедура не обнаружена",
+ "Плохой тип переменной") - сначала прогнать этот чек-лист, потом лезть в отладку.
## Критические правила (ключевые отличия синтаксиса, детали в references)
- - **Логический тип в `Если`.** `Если ПустаяСтрока(Х) Тогда` -> ошибка «Выражение должно иметь логический тип».
+ - **Логический тип в `Если`.** `Если ПустаяСтрока(Х) Тогда` -> ошибка "Выражение должно иметь логический тип".
Нужно сравнение: `Если ПустаяСтрока(Х) = 1 Тогда`, а `НЕ ПустаяСтрока(Х)` -> `ПустаяСтрока(Х) = 0`.
То же для тернарника: `?(ПустоеЗначение(Х) = 1, "", ...)`. Полный список - `references/syntax-gotchas-77.md`.
- - **CP1251.** Grep по кириллице в `.1s` молчит (UTF-8 vs CP1251). Не делай вывод «совпадений нет» по Grep -
+ - **CP1251.** Grep по кириллице в `.1s` молчит (UTF-8 vs CP1251). Не делай вывод "совпадений нет" по Grep -
ищи через `cp1251_io.py grep` или MCP.
- **GComp запускать только из PowerShell.** Из Bash кириллица в путях бьется, gcomp молча выходит с ложным
успехом и ничего не собирает. Рабочий exe - в `C:\Program Files\GComp\Release\` (с `GComp.dll` рядом),
- «голый» exe из каталогов проекта не запускается. Детали - `references/gcomp.md`.
+ "голый" exe из каталогов проекта не запускается. Детали - `references/gcomp.md`.
- **Минимальный diff при багфиксе.** Правь только код, связанный с багом. Не переформатируй CP1251-файл
целиком - рискуешь кодировкой и шумным diff.
## Проверка качества
После правки BSL 7.7 - прогон через MCP `1c-naparnik` (`ask_1c_ai`) для оценки и `validate_query`
(`1c77-metadata`) для запросов. EDT-валидация и `bsl-platform-help` к 7.7 неприменимы (это 8.x).