Лекция

Одна строка, восемь поломок, ноль ошибок

Полина собирает сценарии без кода уже второй год. Её последняя работа выглядит просто: форма на сайте отдаёт заявку в CRM, CRM выгружает строку в таблицу для бухгалтерии, оттуда клиенту уходит письмо. Заявка на оплату курса обучения, семь полей, ничего необычного. Сценарий отработал зелёным — все шаги успешны, ни одного предупреждения.

Через неделю бухгалтерия сказала, что платёж не проходит, клиент — что письмо пришло дважды, а руководитель — что в отчёте за июль появилась заявка, которой в июле не было. Вот та самая строка, которую отдала выгрузка:

Иванов;1 250,50;06.07.2026;044525225;40702810900000012345;8 (900) 123-45-67;0

В этой строке восемь поломок. Не одна и не две — восемь, и каждая случится по своей причине.

  • сумма разорвётся пополам, и все колонки после неё съедут на одну влево
  • дата уедет на 29 дней и попадёт в другой месяц
  • БИК банка станет восьмизначным
  • номер счёта приедет другим числом — не обрезанным, а именно другим
  • клиент появится в базе четвёртой карточкой
  • ноль в поле «согласие на рассылку» превратится в «да»
  • весь текст станет нечитаемым набором букв
  • имя первой колонки перестанет совпадать с картой полей
Главное свойство всех восьми

Ни одна из них не выдаст ошибки. Сервис-приёмник не спрашивает, что вы имели в виду. Он домысливает — молча, мгновенно и в свою пользу. Значение остаётся валидным, просто становится другим.

Шестнадцать тем разбирают эти восемь поломок до механизма: почему они происходят, по какому симптому опознаются и какой вопрос надо задать приёмнику, чтобы они не случились. В финале мы вернёмся к этой же строке и разберём её по частям.

Оговорка о границах. Как ответ доехал от сервиса к сервису — тема отдельной лекции про API и вебхуки. Здесь речь о том, что лежит внутри значения: форма записи, тип, пустота, вложенность, единица измерения. Транспорт может быть безупречным, а данные приехать испорченными — это две независимые вещи.

Тема 1 из 16 · Что лежит внутри поля

У поля есть тип, и типов ровно семь

Когда сервис отдаёт ответ, внутри лежит не «текст» и не «данные вообще». Внутри лежат значения, у каждого значения есть тип, и набор типов закрыт. В формате JSON, на котором говорит большинство сервисов, типов ровно семь, и список не расширяется по договорённости между вами и приёмником.

Спецификация формата — RFC 8259 — в разделе 3 говорит дословно: «A JSON value MUST be an object, array, number, or string, or one of the following three literal names: false, null, true». Грамматика там же:

value = false / null / true / object / array / number / string
Семь типов значения и что о каждом надо помнить
ТипКак выглядитЧто важно знать
Строка«Иванов», «044525225»внутри может быть что угодно, включая одни цифры
Число1250.5, 42ведущие нули запрещены грамматикой — тема 5
Объектнабор пар «имя — значение»порядок пар не гарантирован — тема 3
Массивсписок значений по порядкуодин элемент и список из одного — разные вещи, тема 4
truetrueлитерал, а не строка «true»
falsefalseвторой литерал; вместе с первым это и есть «булево»
nullnull«значение известно, и оно отсутствует» — тема 2

Булевого типа в списке нет как отдельной строки: true и false — два самостоятельных литерала из семи. Тот же раздел спецификации требует: «The literal names MUST be lowercase». Регистр значим. True, FALSE и Null — не значения JSON, а место, где разбор документа обрывается.

Чего в списке нет

Даты. Слово «date» в спецификации формата встречается только в служебных оборотах, как тип оно не определено нигде. Значит, дата всегда едет либо строкой, либо числом — а получатель догадывается, чем именно. На этой догадке держится половина поломок из этой лекции, и ей отданы шесть тем из шестнадцати.

Отсюда первый рабочий вопрос к любому полю: какого оно типа у отправителя и какого типа его ждёт приёмник. Это два разных вопроса, и совпадают ответы далеко не всегда. Второй вопрос — что происходит, когда значения нет вовсе.

Проверка
Сервис отдал поле active со значением True — с большой буквы. Что это с точки зрения формата?
RFC 8259 §3: «The literal names MUST be lowercase». Литералы бывают только true, false и null. True без кавычек — не строка (у строки были бы кавычки) и не литерал. Это ошибка разбора, и здесь вам повезло: она хотя бы видна. Дальше в лекции будут поломки, которые проходят молча.
Проверка
Сколько типов значения определяет формат и есть ли среди них дата?
Семь, и список закрыт грамматикой: value = false / null / true / object / array / number / string. Даты в нём нет. Всё, что выглядит как дата, на самом деле строка или число — и то, как приёмник его прочтёт, зависит от приёмника, а не от формата.
Бесплатный доступ

Дальше нужен аккаунт

Прогресс и монеты сохранятся.