Порты расходились в трёх местах, и каждое проявлялось только в редком
случае — то есть там, где цена ошибки максимальна.
1. Вывод. PS наследовал консоль (текст платформы попадал в поток без
метки и в непредсказуемой позиции), PY захватывал его и не печатал
вовсе — аварийное сообщение мимо /Out терялось. Теперь оба порта
захватывают вывод и печатают его отдельным блоком «Вывод платформы»,
только если он непуст: молчащий успех остаётся молчаливым.
2. Кодировка. PS декодировал вывод ibcmd как cp866, тогда как ibcmd
пишет UTF-8 (проверено на 8.3.24, 8.3.27, 8.5) — русские сообщения
приходили крякозябрами. PY использовал text=True, то есть локальную
кодовую страницу. Теперь оба декодируют UTF-8 строго, с фолбэком на
cp866 для аварийного текста 1cv8.
3. Квотирование. PY не работал с путём к базе, содержащим пробел, — ни
на Windows, ни на macOS: 1С ждёт кавычки внутри значения
(File="путь"), а subprocess квотирует токен целиком. PS работал,
потому что вклеивал кавычки сам. Теперь обе версии строят токены
одинаково; на Windows PY передаёт готовую командную строку.
Плюс валидация ввода: путевые параметры прощают обрамляющие кавычки,
пробелы по краям и хвостовой разделитель, а навыки, требующие готовую
базу, проверяют её наличие до запуска.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>